本篇博文,将从指针和数组来为大家分析一些笔试题,设计内容多,全是干货,接下来让我们一起来看一下吧
数组笔试题
在做题之前,我们需要明白
数组名是数组首元素的地址 | ||
但是有2个例外: | ||
1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节 | ||
2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址 |
一维数组
我们首先看题,答案再代码后面
1. int a[] = {1,2,3,4}; 2. printf("%d\n",sizeof(a));// 16 3. printf("%d\n",sizeof(a+0));// 4/8 4. printf("%d\n",sizeof(*a));// 4 5. printf("%d\n",sizeof(a+1));// 4/8 6. printf("%d\n",sizeof(a[1]));// 4 7. printf("%d\n",sizeof(&a));// 4/8 8. printf("%d\n",sizeof(*&a));// 16 9. printf("%d\n",sizeof(&a+1));// 4/8 10. printf("%d\n",sizeof(&a[0]));// 4/8 11. printf("%d\n",sizeof(&a[0]+1));// 4/8
接下来博主会为大家一句一句进行解释
printf("%d\n",sizeof(a));// 16
解释:sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小,所以是16
printf("%d\n",sizeof(a+0));// 4/8
解释:这里的sizeof没有和a直接相连,所以这里并不是整个数组,这里a代表数组首元素的地址,a+0依然是首元素的地址,既然是地址,所以大小为4或8,具体大小由编译器决定
printf("%d\n",sizeof(*a));// 4
解释:*a是数组的首元素,且为int型,所以大小为4
printf("%d\n",sizeof(a+1));// 4/8
解释:a为首元素的地址,a+1为第二个元素的地址,所以大小为4或8
printf("%d\n",sizeof(a[1]));// 4
解释:a[1]为第二个元素,大小为8
printf("%d\n",sizeof(&a));// 4/8
解释:&a为地址,所以大小为4或8
printf("%d\n",sizeof(*&a));// 16
解释:&a是a的地址,前面加上解引用*,则*&a就为a,所以大小为16
printf("%d\n",sizeof(&a+1));// 4/8
解释:&a是地址,那么&a+1也还是地址,所以大小为4或8
printf("%d\n",sizeof(&a[0]));// 4/8
解释:&a[0]是首元素地址,既然是地址,所以大小为4或8
printf("%d\n",sizeof(&a[0]+1));// 4/8
解释:&a[0]为地址,那么&a[0]+1也是地址,既然是地址,所以大小为4或8
字符数组
题 一
1. char arr[] = {'a','b','c','d','e','f'}; 2. printf("%d\n", sizeof(arr));// 6 3. printf("%d\n", sizeof(arr+0));// 4/8 4. printf("%d\n", sizeof(*arr));// 1 5. printf("%d\n", sizeof(arr[1]));// 1 6. printf("%d\n", sizeof(&arr));// 4/8 7. printf("%d\n", sizeof(&arr+1));// 4/8 8. printf("%d\n", sizeof(&arr[0]+1));// 4/8
解释如下
printf("%d\n", sizeof(arr));// 6
解释:数组名单独放在sizeof内部,这里的arr表示整个数组,计算的是整个数组的大小,单位是字节,总共6个字节
printf("%d\n", sizeof(arr+0));// 4/8
解释:arr表示数组首元素的地址,arr+0还是数组首元素的地址,是地址就是4/8个字节
printf("%d\n", sizeof(*arr));// 1
解释:arr表示数组首元素的地址,*arr就是首元素,大小1个字节
printf("%d\n", sizeof(arr[1]));// 1
解释:arr[1]就是第二个元素,大小是1个字节
printf("%d\n", sizeof(&arr));
解释:&arr是数组的地址,但是数组的地址也是地址,是地址就是4/8
printf("%d\n", sizeof(&arr + 1));
解释:&arr + 1是跳过整个数组后的地址,是地址就是4/8个字节
printf("%d\n", sizeof(&arr[0] + 1));
解释:第二个元素的地址,是4/8个字节
题 二
1. char arr[] = { 'a','b','c','d','e','f' }; 2. printf("%d\n", strlen(arr));//随机值 3. printf("%d\n", strlen(arr + 0));//arr 4. printf("%d\n", strlen(*arr));//err 5. printf("%d\n", strlen(arr[1]));//err 6. printf("%d\n", strlen(&arr));//随机值 7. printf("%d\n", strlen(&arr + 1));//随机值 8. printf("%d\n", strlen(&arr[0] + 1));//随机值
在讲解提二是我们需要了解以下strlen这个函数
格式为
还需要了解一下这个arr的存储
明白这些后,我们开始解释代码
printf("%d\n", strlen(arr));
解释:因为字符数组arr中没有\0,所以在求字符串长度的时候,会一直往后找,产生的结构就是随机值
printf("%d\n", strlen(arr + 0));
解释:arr + 0是首元素的地址,和第一个一样,也是随机值
printf("%d\n", strlen(*arr));//err,
解释: arr是数组首元素的地址,*arr就是数组首元素,就是'a'-97,strlen函数参数的部分需要传一个地址,当我们传递的是'a'时,'a'的ASCII码值是97,那就是将97作为地址传参,strlen就会从97这个地址开始统计字符串长度,这就非法访问内存了,如果访问就会出现下面的情况
printf("%d\n", strlen(arr[1]));//err
解释:与上一条同理
printf("%d\n", strlen(&arr));//随机值
解释:&arr是数组的地址,数组的地址和数组首元素的地址,值是一样的,那么传递给strlen函数后,依然是从数组的第一个元素的位置开始往后统计直到/0结束
printf("%d\n", strlen(&arr + 1));//随机值
解释:与&arr类似,&arr+1是数组的地址加一,所以也是随机值
printf("%d\n", strlen(&arr[0] + 1));//随机值
解释:&arr[0] + 1是第二个元素的地址。结果也是随机值
题 三
1. char arr[] = "abcdef";//[a b c d e f \0] 2. printf("%d\n", sizeof(arr));//7 3. printf("%d\n", sizeof(arr + 0));//4/8 4. printf("%d\n", sizeof(*arr));//1 5. printf("%d\n", sizeof(arr[1]));//1 6. printf("%d\n", sizeof(&arr));//4/8 7. printf("%d\n", sizeof(&arr + 1));//4/8 8. printf("%d\n", sizeof(&arr[0] + 1));// 4/8
我们先看一下arr里面都有什么吧
解释如下
printf("%d\n", sizeof(arr));//7
解释:arr中存储了7个char型色元素,所以为7
printf("%d\n", sizeof(arr + 0));// 4/8
解释:arr + 0是首元素的地址,是地址,所以为4/8
printf("%d\n", sizeof(*arr));// 1
解释:*arr其实就是首元素,1个字节。等价关系:*arr--> *(arr+0) -- arr[0]
printf("%d\n", sizeof(arr[1]));// 1
解释:arr[1]是第二个元素,1个字节
printf("%d\n", sizeof(&arr));// 4/8
解释:&arr是数组的地址,是地址就是4/8个字节
printf("%d\n", sizeof(&arr + 1));// 4/8
解释:&arr + 1是跳过一个数组的地址,是地址,所以为4/8
printf("%d\n", sizeof(&arr[0] + 1));// 4/8
解释:&arr[0] + 1是第二个元素的地址,是地址,所以4/8
题 四
1. // char arr[] = "abcdef";//[a b c d e f \0] 2. // printf("%d\n", strlen(arr));//6 3. // printf("%d\n", strlen(arr + 0));//6 4. // printf("%d\n", strlen(*arr));//*arr为首元素,所以这里错误,err 5. // printf("%d\n", strlen(arr[1]));//arr[1]为第二个元素,所以这里也错误 6. // printf("%d\n", strlen(&arr));//6 7. // printf("%d\n", strlen(&arr + 1));//随机值 8. // printf("%d\n", strlen(&arr[0] + 1));//5
这题我就不一一解释了,各位宝子们结合下图与前面所讲.看懂本题是没有问题的