C语言基础篇(五)——数组

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(),有兴趣的可以自己去调试学习.

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值