c语言的数据结构的声明 和 初始化
简单一句话总结,在数据类型 声明的时候,如果同时给这个变量赋值,这个时候就叫初始化。 如果声明的时候,没有给变量提供初始化。后面无论如何操作都不能叫做初始化了,只能给这个变量做赋值操作了。
典型的就是字符串和数据,结构。
如普通数据类型
int a =3; // 声明变量a的同时,提供初始化操作。
int b; b = 2; // 这个叫赋值操作,不叫初始化。
如数组
int a[] = {1, 2, 3, 4}; //声明数组a,并且提供初始化。
int b[10]; b[1] = 233; 这个叫做赋值。
数组和字符串,这里有点东西
char a[] = {‘a’, ‘b’, ‘c’, ‘d’}; //声明字符数组a,提供初始化,注意里面是单引号。好像c语言唯三个用单引号的地方,第一个是char定义单字符;
char b[] = “hello world”; //声明字符数组b, 提供初始化。注意这里貌似 “hello world” 是字符串常量,但是在这里初始化的表达式里面,就把这个“hello world” 打散,一个字符一个字符的装入字符数组b.
char b[10]; // 如果不提供初始化,就要指定长度, 无论是显式的指定还是隐式的指定。 b[2] = ‘x’; // 给b的第二位 赋值;另一个单引号在这里用。如果是双引号表示的是两个位,默认后面一个是、\0。。。单引号就单单表示一个位。
这里数组只能一个位置一个位置的操作,如赋值,替换等等。不能把一个数组直接赋值给另外一个数组,无论这个数组是什么类型。
有两种办法复制数组,一个是用for 循环对每一个位置进行赋值操作。第二个办法是:采用《string.h》里面的memcpy(a, b, sizeof(a));
对于结构体 也是一样
struct { int a; char b; } ss = {a=2, b=‘x’}; // 声明并且初始化;对于这种无结构标签的结构体,声明的变量就这一个,后面没有办法在利用这个结构体声明变量了。因为没有结构标签。
struct p { int c; char *d; } ss = {c = 12, d=“helllo”}; //声明并且初始化,这种带有结构标签p的结构体,后续是可以继续单独定义变量的。如果新定义结构体,要带上struct…他俩是一起的,如: struct p s3; //注意这里是定义了一个类型是struct p的结构体,名字是s3,但是我们没有初始化,只是定义了变量 struct p s4 = {c = 33, d=“world”}; // 声明s4变量,同时提供初始化。注意这里和最上面的变量ss …这两个某种程度上来说是一样的,都是定义新的变量同时初始化。
同时: s3.c = 23; s3.d = “new value”; 是可以这么给s3结构体里面的成员赋值的。
对于结构是可以互相赋值的,这点比数组要好,数组无法一个数组赋值给另外一个数组,但是结构可以。
所以上面的s3=s4 也是OK的。
同时如果想要互相赋值两个数组,可以吧两个数组先放到结构里面,然后在把两个结构赋值,就可以变形实现两个数组赋值;
如: struct Arr { int a[10]; } a1, a2; 泽可以 a1=a2;
|