当前位置: 首页> 娱乐> 明星 > 数组和指针 笔试题(2)

数组和指针 笔试题(2)

时间:2025/7/14 22:09:39来源:https://blog.csdn.net/2301_80349538/article/details/141788004 浏览次数:0次

d7c5e5e2d84247c28b83e9c9c09971dc.png

目录

6.笔试题6

7.笔试题7

8.笔试题8

9.笔试题9

10.笔试题10


 

6.笔试题6

	笔试题6char* p = "abcdef";printf("%zd\n", sizeof(p));//p是首元素a的地址,是地址就打印4/8printf("%zd\n", sizeof(p+1));//p是首元素地址,+1跳过1个sizeof(char)字节,也就是跳到b的地址,是地址就打印4/8printf("%zd\n", sizeof(*p));//首元素地址接引用,是'a',打印1printf("%zd\n", sizeof(p[0]));//相当于加0后解引用,所以是'a',打印1printf("%zd\n", sizeof(&p));//二级指针,是地址就打印4/8printf("%zd\n", sizeof(&p+1));//是地址就4/8printf("%zd\n", sizeof(&p[0]+1));//p[0]是首元素地址+0再解引用,得到'a',再将'a'的地址取出来,最后得到的是地址,是地址就打印4/8

7.笔试题7

//笔试题7
char* p = "abcdef";
printf("%zd\n", strlen(p));
//p是首元素地址,从'a'开始数,打印6
printf("%zd\n", strlen(p + 1));
//首元素地址+1,跳到b的地址,从b的地址开始数,打印5
printf("%zd\n", strlen(*p));
//strlen接受的不是字符型地址,报错
printf("%zd\n", strlen(p[0]));
//strlen接受的不是字符型地址,报错
printf("%zd\n", strlen(&p));
//传递的是二级指针,无关,打印随机值
printf("%zd\n", strlen(&p + 1));
//p是首元素地址,取出地址的地址是二级指针,随机值
printf("%zd\n", strlen(&p[0] + 1));
//p[0]是加0后解引用,就是'a',取出'a'的地址再加1,就是b的地址,打印5

8.笔试题8

	int a[3][4] = { 0 };printf("%zd\n", sizeof(a));//sizeof(数组名)表示整个数组,整个数组48个字节,打印48printf("%zd\n", sizeof(a[0][0]));//a[0][0]拿到二维数组第一个元素,4个字节,打印4printf("%zd\n", sizeof(a[0]));//a[0]是第一行的数组名,sizeof(数组名)表示整个数组,第一行16个字节,打印16printf("%zd\n", sizeof(a[0]+1));//a[0]是第一行的数组名,既不是sizeof(数组名),也不是&数组名,所以是第一行首元素地址//第一行首元素地址+1,还是地址,是地址就打印4/8printf("%zd\n", sizeof(a+1));//a是首元素地址,+1是第二行地址,是地址就打印4/8printf("%zd\n", sizeof(*(a+1)));//a是首元素地址也就是第一行地址,第一行地址+1后是第二行地址,第二行地址解引用得到的是第二行,第二行一共16个字节//打印16printf("%zd\n", sizeof(&a[0]+1));//a[0]是第一行的数组名,&数组名,拿出整个第一行的地址,+1后表示第二行的地址,//是地址就打印4/8printf("%zd\n", sizeof(*(&a[0] + 1)));//这里的a[0]是第一行数组名,&数组名+1,拿到第二行的地址,*表示拿到第二行,第二行一共16个字节printf("%zd\n", sizeof(*a));//a表示首元素地址,也就是第一行的地址,解引用得到第一行,第一行16个字节,打印16printf("%zd\n", sizeof(a[3]));//a[3]是第四行,不会过载,不会计算,打印16

9.笔试题9

#include<stdio.h>
int main()
{//笔试题9int a[5] = { 1,2,3,4,5 };int* ptr = (int*)(&a + 1);//取出整个数组的地址,+1,跳过这个数组//a[][][][] [][][][] [][][][] [][][][]&a+1printf("%d,%d", *(a + 1), *(ptr - 1));//第一个是数组首元素地址+1,跳过1个int字节,指向2的地址,解引用后为2//第二个 ptr是个指针,指针-1,跳过1个sizeof(int),也就是减去四个字节//[][][][] [][][][] [][][][] [][][][] ptr-4[][][][] ptr//第二个地址指向的是arr[4],打印5return 0;     
}                          

10.笔试题10

	//笔试题10int a[3][2] = { (0,1),(2,3),(4,5) };//逗号表达式,{1,3,5}int* p;p = a[0];//a[0]是第一行数组名,数组名表示首元素地址,所以它表示的是第一行首元素的地址printf("%d", p[0]);//第一行首元素,也就也是打印1return 0;

注意:这里的二维数组初始化用的是( ),那么就会变成逗号表达式

逗号表达式: 表达式1,表达式2 ,表达式3

逗号表达式的先进行表达式1,再进行表达式2,最后进行表达式3,但是它的结果只看表达式3

所以这里的二维数组初始化其实是1,3,5,a[0][1] 为5

 

 

 

 

 

关键字:数组和指针 笔试题(2)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: