C语言基础篇(五)——数组
一.数组
1.初始化相关问题
int a = 2;
int arr1[3];
int arr2[3] = { 1 };
char arr3[3] = { 'a' };
int * arr4[3] = { &a };
printf("%d,%d,%d\n", arr1[0], arr1[1], arr1[2]);
printf("%d,%d,%d\n", arr2[0], arr2[1], arr2[2]);
printf("%c,%c,%c\n", arr3[0], arr3[1], arr3[2]);
printf("%d,%d,%d\n", arr4[0], arr4[1], arr4[2]);
数组未初始化,系统自动初始化为随机值,若已确定数组大小,却未初始化完全,则系统把未初始化的数组元素初始化为0.那么字符数组和指针数组初始化为什么呢?
我们跟踪调试,发现字符数组已知大小却未完全初始化,系统把剩余的数组元素初始化为\0(字符串结束标识符),同理指针数组会自动初始化为空指针(指向NULL)。
2.数组相关问题
1.数组名到底表示什么?
int arr[3] = { 1,2,3 };
printf("%0xd,%d\n", arr, *arr);
可以看出arr类似一个指针(但和指针不同),指向数组首元素,那么10ff94cd表示什么呢?
arr里存了一个地址,这个地址和arr[0]的地址一样,因此数组名可以当作数组首元素的首地址。
拓展:数组名和指针有什么区别呢?
可以看出系统为指针p分配了内存来存储自己的地址,而数组名却没有自己的内存来存储自己的地址。
2.数组名不能在赋值符的左边。数组名如果在赋值符的右边,意义为数组首元素的首地址。
3.数组作为函数参数直接传递
如果用数组名作为参数,数组名会退化为指向数组首元素的指针。
4.数组不允许越界。
5.数组不能整体赋值。(如何整体赋值见下文字符数组)
二.字符数组
1.字符数组的初始化
char arr1[6] = { 's','i','n','g','l','e' };
char arr2[7] = { 's','i','n','g','l','e' };
char arr3[7] = "single";
printf("%s]\n", arr1);
printf("%s\n", arr2);
printf("%s\n", arr3);
为什arr1后边会输出乱码呢?
这个就要说一说\0(字符串结束标志符),printf用%s格式输出字符串时碰到\0才会停止,arr1中就没有存\0,arr2和arr3最后都默认存储了\0。
为什这里会报错呢?
因为\0虽然不会输出,但也是个字符占一字节内存,所以数组内存分配太小,越界了。
2.如何实现数组整体的赋值(这里需要调用库函数string.h)
a.赋值:strcpy(字符串1,字符串2)
把字符串2赋值给字符串1(字符串1>=字符串2,否则数组越界,程序奔溃)
char arr1[7] = "single";
char arr2[4] = "dog";
char arr3[10] = { '\0' };
strcpy_s(arr2, arr1); //strcpy_s()更安全些,两者功能一样
printf("%s\n",arr2);
拓展:在string.h库中有求字符串大小的函数strlen()
a.strlen()与sizeof()在求字符串大小时的区别?
char arr[7] = "single";
printf("strlen(arr)=%d\n", strlen(arr));
printf("sizeof(arr)=%d\n", sizeof(arr));
strlen()求的是字符串真实的大小,不算’\0’的大小;
sizeof()求的是字符串所占内存的大小,算’\0’的内存大小。
string.h库中还有许多的字符串处理函数,如:puts(),gets(),strcat( , ),strcmp( , ),strlwr(),struor(),有兴趣的可以自己去调试学习.
1461

被折叠的 条评论
为什么被折叠?



