目录
字符数组和指针的笔试题(sizeof篇)
1.
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));
"abcdef" 字符串的末尾隐藏了一个 '\0' ,所以存储在 arr数组 的所有元素是['a' 'b' 'c' 'd' 'e' 'f' '\0']
数组名单独放在sizeof内部,计算的是整个数组的大小,包括 '\0'
所以结果是 7字节
2.
char arr[] = "abcdef";
printf("%d\n", sizeof(arr + 0));
数组名没有单独放在sizeof内部,也没有取地址,所以这里的数组名代表的是首元素的地址,那么首元素的地址加0,还是首元素的地址,sizeof(地址)
所以结果是 4/8字节
3.
char arr[] = "abcdef";
printf("%d\n", sizeof(*arr));
*arr 表示为数组名是首元素地址,解引用后得到的是数组首元素,每个元素是char类型的
所以结果是 1字节
4.
char arr[] = "abcdef";
printf("%d\n", sizeof(arr[1]));
arr[1] 是第二个元素,所以结果是 1字节
5.
char arr[] = "abcdef";
printf("%d\n", sizeof(&arr));
&arr 表示的是取出整个数组的地址,整个数组的地址也还是地址,sizeof(地址)
所以结果是 4/8字节
6.
char arr[] = "abcdef";
printf("%d\n", sizeof(&arr + 1));
整个数组的地址加1,加的是自身大小的1,也就是跳过了整个数组,指向了数组最后一个元素的下一个地址,但只要是地址,结果都是一样的
所以结果是 4/8字节
7.
char arr[] = "abcdef";
printf("%d\n", sizeof(&arr[0] + 1));
&arr[0] + 1 表示的是取出第一个元素的首地址再加1,加1后指向的是第二个元素的首地址,但只要是地址……
所以结果是 4/8字节
字符数组和指针的笔试题(strlen篇)
1.
char arr[] = "abcdef";
printf("%d\n", strlen(arr));
在上篇中有说到,strlen函数的作用是统计字符串中 '\0' 之前的字符个数,且arr数组中末尾有一个隐藏的'\0'
所以结果是 6个元素
2.
char arr[] = "abcdef";
printf("%d\n", strlen(arr + 0));
arr + 0 表示的是 数组首元素地址加0,加0后还是数组首元素地址,所以结果和第一题结果一样
所以结果是 6个元素
3.
char arr[] = "abcdef";
printf("%d\n", strlen(*arr));
strlen函数的参数部分是 const char* str ,所以要传递正确的参数才能正常运行
*arr 表示的是对数组首元素地址解引用,找的的是字符 'a' 这个元素,'a' 的ASCII码值是97,编译器会把97这个数字当作参数传递给strlen函数,strlen函数就会从地址为97的地方开始往后统计字符串个数,这样就会涉及到非法访问
所以结果是 程序报错
4.
char arr[] = "abcdef";
printf("%d\n", strlen(&arr[0] + 1));
&arr[0] + 1 表示的是 取出第一个元素的首地址后加1,加1后指向的是第二个元素的首地址,那么strlen函数就会从第二个函数开始往后统计字符串中的字符个数
所以结果是 5个元素
小结
1. sizeof关键字计算的是数据所占内存空间的大小
2. 只要是地址,sizeof(地址) 的大小就是 4/8字节
3. strlen函数的参数部分需要传递的是 char* 类型的参数