LinuxC预习——第二章数据类型

基本上大学C语言课程都学到了,不过忘记了很多,遇到了一些问题。

1、关于字符串地址赋值遇到了疑问。

原题目是分辨哪里错了:

char *str = 'hello world';
printf("%s\n",str);
*str = "goodbye world";
printf("%s\n",str);
`

根据解析,第一行代码是字符串重编,所以把地址给了str,str指向"hello world"这个字符串。第三行赋值的时候是吧字符串"goodbye world"的首地址给与到写到第一行字符串的第一位’h’上,字符串地址自然是不能赋值给字符串的,并且字符串"hello world"是常量,常量是无法改变的。
字符串赋值的时候是赋予地址,而
*str则是一种访问方式,正确的使用方法是使用strcpy。

2、基本内置类型里遇到了一个没看过的东西——枚举类型。
枚举类型,到后来发现和enum定义有关,可通过typedef或者 #define等方式命名。再不赋予值的时候,变量会在上一个变量的基础上+1。

3、 在2.4.2陷阱之有符号与无符号 这一节遇到问题。
基本上,补码和数据类型大小都能理解,但是无法理解为何数值变为0000 0000时会停止,后来发现字符 "\0"等效于0x00整个原理就明白了。

4、声明和定义的区别有点不清楚
定义是创建了一个名字和它挂钩的空间,不知道这样做的目的是为什么。后来说明了extern的变量后就明白了:
定义是创建这个变量名字和空间,无法挪用的。
而声明则是创建一个名字和空间,但是这个名字是挂牌,定义实在别的文件定义,就是告诉本文件留个空间给全局变量。特意看了一下,当有多个同名全局变量的定义的时候,只会取用最先的定义。我就想了一下,在编译的时候,编译文件顺序的不同可能导致计算结果的不同,所以全局变量最好不要重复吧。

5、全局变量的static和extern的一些小细节问题。
static和extern不同的地方在于,static的寿命虽然长,但是作用域依旧没有改变。
extern如果在main函数外定义,则效果和理想的一样。但是如果先后创建了两个函数f1和f2,当在f2中添加全局函数变量时,f1中无效。因为很明显也要考虑读写优先的问题。
在函数内部再加个函数作用域,当外部有个全局变量x时候,内部作用域可以定义个局部作用变量x,两个x不互相影响,只是作用域不同。

6、const作用问题
但看const的例子的时候很容易理解,但是联系到后面tpyedef就有点犯迷糊了, const作用的核心宗旨是后面跟谁谁不变。

7、typedef和#define的不同
初看两者作用相似,都是改变变量名,后来发现tpedef更厉害,原话是:“给数据类型定义一个新名字”而不是像#define一样是简单的替换。

typedef char * p_str1;
#define p_str2 char *;
p_str1 s1,s2;
p_str2 s3,s4;

结果是s1、s2、s3是char*而s4是char。

关键是后面和const一起使用,更是解释了何为给‘类型定义’换个名字:

typedef char * p_str:
char string[4] = "abc";
const car  *p1 = string;
const p_str p2 = string;
p1++;
p2++;

试问之中哪出错了?
答案是p2++;
因为const 直接作用的是p2,所以p2地址变量变成了常量,所代表的地址值无法变化,所指内容可以变化。而p1是地址可以变化,但是原来*p1所指的内容是常量不可变。

8、联合体的使用
为何要使用联合体?
因为可以节省空间,可以将一堆数据用在相邻的一片空间之中,更多的用法等以后课题中使用。

猜你喜欢

转载自blog.csdn.net/qq_43257912/article/details/82961763