前言
在计算之前要了解基本概念:
数组名的理解
数组名是数组首元素的地址
有两个例外
1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组中的大小,单位是字节。
2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址
整型数组
#include<stdio.h> int main() { int a[] = { 1,2,3,4 }; printf("%d\n", sizeof(a));
a是数组名,数组名单独放在sizeof内部,计算的是整个数组的大小,4*4=16,size(a)大小是16个字节
printf("%d\n", sizeof(a + 0));
数组名a是数组首元素地址,a+0还是数组首元素地址,是地址就是4/8个字节
printf("%d\n", sizeof(*a));
*a=a[0],数组名a是数组首元素地址,*a就是首元素,求的是大小不是地址,整型的大小是4个字节
printf("%d\n", sizeof(a + 1));
数组名a是数组首元素地址,a+1是数组第二个元素地址,是地址就是4/8个字节
printf("%d\n", sizeof(a[1]));
a[1] = (a + 1),a是数组首元素地址,a+1是数组第二个元素地址,(a+1)就是第二个元素,就是求大小,整型数组大小就是4个字节。
printf("%d\n", sizeof(&a));
&a取出的是整个数组的地址,是地址就是4/8个字节
printf("%d\n", sizeof(*&a));
sizeof(*&a)=sizeof(a),这里的a表示整个数组,计算的是整个数组中的大小,单位是字节。4 * 4=16
printf("%d\n", sizeof(&a + 1));
&a表示整个数组的地址,&a+1表示跳过整个元素,依然是地址,是地址就是4/8个字节
printf("%d\n", sizeof(&a[0]));
&a[0]是数组首元素地址,4/8个字节
printf("%d\n", sizeof(&a[0] + 1));
&a[0]是数组首元素地址,&a[0] + 1就是数组第二个元素的地址,4/8个字节
return 0; }
在x64的环境下就是8个字节,在x86环境下就是4个字节
通常使用的是x86环境
字符数组
第一组题
int main() { char arr[] = { 'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));
arr单独放在sizeof内部,计算的是整个数组的大小,char类型的数组,单位是一个字节,1*6=6
printf("%d\n", sizeof(arr+0));
arr表示数组首元素地址,arr+0依旧是首元素的地址,是地址,就是4/8个字节
printf("%d\n", sizeof(*arr));
arr表示数组首元素地址,*arr表示首元素,注意计算的不是地址,是大小,首元素的大小是1个字节
printf("%d\n", sizeof(arr[1]));
arr[1]=*(arr+1),arr[1]表示第二个元素,注意计算的不是地址,是大小,第二个元素得大小是1个字节
printf("%d\n", sizeof(&arr));
&arr是整个数组的地址,是地址就是4/8个字节
printf("%d\n", sizeof(&arr+1));
&arr是整个数组的地址,&arr+1表示跳过整个数组,依旧表示地址,是地址就是4/8个字节
printf("%d\n", sizeof(&arr[0]+1));
&arr[0]是首元素的地址,&arr[0]+1是第二个元素的地址,是地址就是4/8个字节
return 0; }
第二组题
strlen是库函数
作用是求字符串长度,统计的是在字符串中\0之前的字符的个数
如果没有\0就会一直往后找
int main() { char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", strlen(arr));
因为字符数组arr中没有\0,所以在求字符串长度的时候,会一直往后统计字符串长度,产生的结果是随机值
printf(“%d\n”, strlen(arr + 0));
//arr是首元素地址,arr+0还是首元素地址, 和第一个一样,还是随机值
printf("%d\n", strlen(*arr)); //错误代码
arr是数组首元素地址,*arr是数组首元素,就是’a’,'a’的ASCII码值是97,
strlen函数参数需要传地址,那就是将97作为地址传给strlen,strlen就从97这个地址往后统计字符串长度,这就非法访问内存了
//错误代码 printf("%d\n", strlen(arr[1]));
arr[1]是数组第二个元素,‘b’,访问的是’b’的ASCII码值是98,所以也是错误代码
printf("%d\n", strlen(&arr));
&arr是数组的地址,数组的地址和首元素的地址一样,所以传递给strlen函数后,依然是从数组的第一个元素向后统计字符串长度,随机值
printf("%d\n", strlen(&arr + 1));
&arr是首元素地址,&arr+1跳过整个数组,从数组最末端向后统计字符串长度,结果也是随机值
printf("%d\n", strlen(&arr[0] + 1));
&arr[0] + 1是第二个元素地址,strlen从第二个元素地址向后统计字符串长度,结果也是随机值
return 0; }
第三组题
int main() { char arr[] = "abcdef";//里面实际放有[a b c d e f \0]
printf("%d\n", sizeof(arr));
arr单独放在sizeof里面,计算的是整个数组的大小,单位是字节,
char类型的数组,单位是一个字节,1*7=7,结果是7个字节
printf("%d\n", sizeof(arr+0));
arr表示首元素地址,arr+0还是表示首元素地址,是地址,就是4/8个字节
printf("%d\n", sizeof(*arr));//*arr=*(arr+0)=arr[0]
arr表示首元素的地址,*arr表示首元素,数组类型是char类型,单位是一个字节,所以首元素的大小是一个字节
printf("%d\n", sizeof(arr[1]));
arrp[1]表示第二个元素,大小是一个字节
printf("%d\n", sizeof(&arr));
&arr表示整个数组地址,地址是4、8个字节
printf("%d\n", sizeof(&arr+1));
&arr表示整个数组地址,&arr+1表示跳过整个数组,依然是地址,是地址就是4/8个字节
printf("%d\n", sizeof(&arr[0]+1));
&arr[0]表示首元素地址,&arr[0]+1表示第二个元素地址,是地址就是4/8个字节
return 0; }
总结
以上就是第一部分的指针和数组笔试题和详细解释。