概述
指针和数组笔试题目解析
- 前言
- 一. 一维数组
- 二. 字符数组
- 三. 字符串
- 四. 字符指针
- 五. 二维数组
前言
我们在前面已经学完了指针和数组的相关知识 接下来我们用下面这些问题来考验下我们对于知识的掌握
程度到底如何 掌握的是否扎实
一. 一维数组
int main()
{
int a[] = {1,2,3,4};
printf("%dn",sizeof(a));//1
我们首先看第一条 我们在前面的学习中学到了 sizeof(a)其中a是整个数组的意思
所以说 第一条打印的结果是16
printf("%dn",sizeof(a+0));//2
再来看第二条 这里面的a不是sizeof里面的前面也没有&符号 所以说他就是个首元素地址 它在32位置系统
上大小是4 在64位系统上大小是8
printf("%dn",sizeof(*a));//3
这里的a是首元素地址大家应该都能理解了吧 对它进行解引用得到的是一个整型 1 是int类型 大小是4个字节
printf("%dn",sizeof(a+1));//4
首元素地址加一 还是一个地址 地址的大小是4或者8 值得一提的是这个地址应该是指向2的
printf("%dn",sizeof(a[1]));//5
这里的a{1}的意思和*(a+1)是一样的 是第二个元素的意思 大小是4个字节
printf("%dn",sizeof(&a));//6
这里的&a取出的是整个数组的地址 但是因为是一个地址 所以大小是4/8
printf("%dn",sizeof(*&a));//7
&a是取出整个数组的地址 然后解引用一下自然就得到了整个数组啦 计算整个数组的大小 就是16
printf("%dn",sizeof(&a+1));//8
这里的取地址a是取出整个数组的地址 然后加一 向后移动一整个数组的距离 但是还是地址 地址大小4/8
printf("%dn",sizeof(&a[0]));//9
a{0}就是等价于*(a+0)取出首元素的内容 再取地址 所以是4/8
printf("%dn",sizeof(&a[0]+1));//10
还是地址 4/8
return 0;
}
运行结果如下图
二. 字符数组
int main()
{
char arr[] = { 'a','b','c','d','e','f' };
我们先来分析下这个数组 它有六个元素 每个元素都是char类型
printf("%dn", sizeof(arr));
前面讲过的arr表示数组的两个情况 大家应该还记得把
所以说 此时arr的大小是6
printf("%dn", sizeof(arr + 0));
这个时候arr表示的首元素地址加上0表示的还是首元素地址 大小是4/8
printf("%dn", sizeof(*arr));
对首地址进行解引用 此时表示的是一个字符
所以说大小是1
printf("%dn", sizeof(arr[1]));
这个已经讲过很多遍了 arr{1}表示的和*(arr+1)一样
表示的是第二个元素b 所以大小是1
printf("%dn", sizeof(&arr));
这里是一个地址 所以大小是4/8
printf("%dn", sizeof(&arr + 1));
是一个地址 所以大小是4/8
printf("%dn", sizeof(&arr[0] + 1));
是一个地址 所以大小是4/8
不过这里值得一提的是 它其实是对第一个元素取地址然后加一
printf("%dn", strlen(arr));
strlen要到找到‘0’才会停止 所以说会是一个随机值
值得注意的是这里的arr是首元素地址传进去的
printf("%dn", strlen(arr + 0));
arr+0也是首元素地址 所以说还会使随机值
printf("%dn", strlen(*arr));
这里对arr进行解引用就是拿到了第一个字符‘a’ 也就是97 这个地址是被禁止访问的
所以说会报错
printf("%dn", strlen(arr[1]));
这里的arr{1}的意思也是提到过很多次了
就是对于*(arr+1) 拿出来的是第二个元素
所以说会报错
printf("%dn", strlen(&arr));
这里还是传进去的首元素地址 所以说还是一个随机值
printf("%dn", strlen(&arr + 1));
这里传递进去的是跳过6个元素的地址
所以说还是一个随机值
printf("%dn", strlen(&arr[0] + 1));
这里是首元素地址跳过一个元素的地址
所以说还是一个随机值
return 0;
}
三. 字符串
int main()
{
char arr[] = "abcdef";
这里其实除了abcdef之外还有个/0字符
printf("%dn", sizeof(arr));
因为上面的解释 这里有7个字符
printf("%dn", sizeof(arr + 0));
这里传递进去的其实是首元素地址
地址的大小当然就是4/8
printf("%dn", sizeof(*arr));
这里对于arr进行解引用 所以说是一个a字符
大小是一个字节
printf("%dn", sizeof(arr[1]));
arr{1}实际上就是*(arr+1) 是b字符
大小是一个字节
printf("%dn", sizeof(&arr));
取地址arr取出的是整个数组的地址 实际上就是地址 大小是4/8个字节
printf("%dn", sizeof(&arr + 1));
是一个地址 大小是4/8个字节
这里要注意的是跳过了7个元素
printf("%dn", sizeof(&arr[0] + 1));
是一个地址 大小是4/8个字节
跳过了一个元素
printf("%dn", strlen(arr));
这里传递进去的实际上是首元素地址
所以说字符串长度是6个字节
printf("%dn", strlen(arr + 0));
实际上传递进去是首元素地址
所以说字符串长度是6个字节
printf("%dn", strlen(*arr));
对于arr进行解引用的话实际上传递进去的是’a‘
而求长度实际上要传递进去一个地址 所以说会报错
printf("%dn", strlen(arr[1]));
会报错 原因同上
printf("%dn", strlen(&arr));
这里取地址 取出的是首元素地址
字符串长度是6
printf("%dn", strlen(&arr + 1));
这里会传递进去的是’/0‘后面的地址
长度会是一个随机值
printf("%dn", strlen(&arr[0] + 1));
这里是从b开始检测字符串长度的
长度是5
return 0;
}
四. 字符指针
int main()
{
char* p = "abcdef";
printf("%dn", sizeof(p));
这里的p是一个指针 所以说它的大小是4/8
printf("%dn", sizeof(p + 1));
这里指针加减整数之后还是指针 所以说大小还是4/8
printf("%dn", sizeof(*p));
对p进行解引用 解引用出来得到字符a 所以说大小是一个字节
printf("%dn", sizeof(p[0]));
这里的p{0}其实就相当于*(p+0)得到的是字符a 所以大小是一个字节
printf("%dn", sizeof(&p));
对于指针p进行取地址 实际上就是一个地址 大小是4/8个字节
printf("%dn", sizeof(&p + 1));
地址加一还是一个地址 所以说大小还是4/8个字节
printf("%dn", sizeof(&p[0] + 1));
这里先出去的是a的地址 加一 还是一个地址 所以说是4/8个字节
printf("%dn", strlen(p));
p指向的是a的地址
所以说字符串长度会是6
printf("%dn", strlen(p + 1));
p加一指向的是b的地址
所以说字符串长度会是5
printf("%dn", strlen(*p));
传递进去的是’a‘这个字符
所以说会报错
printf("%dn", strlen(p[0]));
这里的传递进去的还是’a‘这个字符
所以说会报错
printf("%dn", strlen(&p));
将指针p的地址传递进去 会是一个随机值
printf("%dn", strlen(&p + 1));
同上 随机值
printf("%dn", strlen(&p[0] + 1));
这里其实是一个指针指向’b‘
所以说长度是5个字节
return 0;
}
五. 二维数组
int main()
{
int a[3][4] = { 0 };
是一个二维数组 所有元素初始化都为0
printf("%dn", sizeof(a));
sizeof(a)是整个数组的大小 所以应该是3x4x4 48
printf("%dn", sizeof(a[0][0]));
这里是第一个元素的大小 是4
printf("%dn", sizeof(a[0]));
这里是表示数组的第一行可以看作是一个数组 有四个元素 所以大小是16
printf("%dn", sizeof(a[0] + 1));
这里表示的数组第一行的地址 加上一还是一个地址所以大小是4/8
printf("%dn", sizeof(*(a[0] + 1)));
其实就是访问数组第一行第二个元素 大小是4个字节
printf("%dn", sizeof(a + 1));
这里是一个地址 大小是4/8个字节
printf("%dn", sizeof(*(a + 1)));
这里是数组首元素地址加一再进行解引用 实际上访问的是一行的大小 是16个字节
printf("%dn", sizeof(&a[0] + 1));
这里对于数组进行取地址再加一 后面还是一个地址 大小是4/8个字节
printf("%dn", sizeof(*(&a[0] + 1)));
这里对于a{0}取地址取到的是第一行的数组的地址 加上一之后是第二行的地址 解引用取出第二行的数组 大小是16个字节
printf("%dn", sizeof(*a));
对于a进行解引用取出第一个元素 实际上就是第一行 大小是16个字节
printf("%dn", sizeof(a[3]));
这里数组实际上并没有越界 大小还是一行 4个元素 16个字节
因为sizeof 里面的数据是不会进行计算的
return 0;
}
以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏 希望大佬们看到错误之后能够
不吝赐教 在评论区或者私信指正 博主一定及时修正
那么大家下期再见咯
最后
以上就是自由向日葵为你收集整理的指针和数组笔试题目解析前言的全部内容,希望文章能够帮你解决指针和数组笔试题目解析前言所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复