基本数据类型
在C语言中 基本数据类型 具有单一的值,比如int 、char(也是整形)、布尔类型、浮点型等。
ps:int a = 1;或者是 int b = 1; b = 2;这两个(整形变量a、b)都是正确的。
他们之间的区别在于 “计算机中数的表示”。主要就是整形和浮点型两种。
1、基本数据类型在大家学习C语言的时候基本不会出错。
2、基本数据类型的变量(变量名)在做左值时表示一块存储空间,,在其他地方都表示取存储空间中的内容替换到所在的地方
3、再加上C语言有隐式类型转换。所以大家都不会遇到什么问题。
复合数据类型
C语言的 复合数据类型主要就是 结构体、数组、字符串。
在复合数据类型中,复合数据类型名 既可以表示一个*整体*,又可以表示这个*整体的每个组成单元*。
结构体
结构体的各成员是相邻的,但不是“紧挨”的,因为有内存“对齐”。
struct student {
int id ;
char name[20]
};
struct student zhangsan = {1, "zhang3"};//这是一种赋值方式。(初始化时)
struct student lisi;
lisi = zhangsan;//z这是第二种主要的赋值方式。
其他赋值也有,但是不是小编想重点讲的。
在结构体的第二种赋值方式中,很常见。由于第二种结构体赋值方式可以,所以结构体可以作为 函数的返回值 和 参数。
数组
1、数组由一系列相同类型元素组成。
2、数组的各元素之间是相邻的。
3、int a[10] = {0};
int b[10] = {0};
a = b;// 在数组的这种赋值是错误的。“array type ‘int [10]’ is not assignable”.
(1)数组名做右值的时候会转换为指针类型(指向数组首元素的指针)。
(2)数组名做左值时,不会转换为指针类型。而是还是数组类型。我们从error 就可以看出来。
所以这个应该就不是其他一些小编说的数组名做左值,会转成指针,(是个常量),所以不能赋值。
这样的话error应该是“expression is not assignable”。
1、由于数组这种赋值不可以。(数组一般的赋值方式就是遍历)。所以数组不可以作为函数的返回值和参数。
???但是你会说明明有int main(int argc, char *argv[ ]) {return 0} .main函数的参数不是数组么,。。。。哈哈,其实还真的不是数组,在这他是指针,只不过是为了读者一眼看出,调用这个函数的时候参数要一个指向数组的指针。
关于指针更多的,小编以后会讲到。
字符串
1、字符串可以看做一个数组; 字符串的元素是字符型的。
2、 “abcdefghigklmn” 这是一个字符串。
3、字符串通常存储在数组中,但是和数组有区别。
(1)字符串末尾有‘\0’这个结束符。数组一般都没有,只有在数组中存字符串时才会手动,或者自动添加结束符。
(2)数组可以任意访问修改它的每个元素,如:arr[2]。但是字符串不允许修改其中的字符。
(3)数组的每个元素的类型可以是基本数据类型,也可以是复合数据类型。但是字符串只能是char型。
关于上面的区别,小编当然不是看了本书,查了查,然后就。。。下面就是我验证的过程
char str[] = “abc”;
str[1] = ‘f’;
printf("%s", str); ---------- //编译没问题,运行结果是 afc
str[3] = ‘a’; -----------//在这就是应该存字符串结束符 的地方。
printf("%s", str); ---------//果不其然,这次是运行结果是 afca??(注:?在这表示数组越界的标示,在这有多个,但是每次运行不一定。)
也就是说printf函数读越界了。也就是str没有‘\0’了。也就是说明了‘\0’的存在。
注:字符串不允许修改其中的字符。但是把字符串存储到数组中,可以修改数组的元素。(我这都是在main函数里面进行测试)
“abcde”.[0] = ‘f’;
error ---------- “expected identifier”
不知道你们有没有一个疑问,为什么不能修改,数组中就可以,字符串直接就不可以?
在字符串存储到数组中(数组初始化时),字符串做右值,会自动转化为指针类型么?
你可以通过 汇编 和 反汇编 验证是不是属实。。
1、在字符串存储到字符数组中的时候,数组初始化,字符串的每个字符都是存储在栈中,只有指向数组(栈顶和栈底)的两个指针,没有字符串‘\0’是编译器添加上去的。
2、其他地方(比如printf(“aafasdf”);)中的字符串它是自动转换为指向字符串的指针了。这个字符串汇编后是存储在(.rodate)段,是只读不可修改的。
3、所以虽然是字符串,但是在ELF文件,内存中是不一样的。