在上一节的内容中,我们继续学习了字符数组
的相关指针
练习题,今天我们将继续将练习有关二维数组的指针练习题
和有关结构体的指针练习题
,好了,话不多说,开整!!!!
二维数组练习题
请分析如下代码,不要直接运行得到结果,代码如下:
#include<stdio.h>
int main()
{
int a[3][4] = {0};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a[0][0]));
printf("%d\n",sizeof(a[0]));
printf("%d\n",sizeof(a[0]+1));
printf("%d\n",sizeof(*(a[0]+1)));
printf("%d\n",sizeof(a+1));
printf("%d\n",sizeof(*(a+1)));
printf("%d\n",sizeof(&a[0]+1));
printf("%d\n",sizeof(*(&a[0]+1)));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a[3]));
return 0;
}
在分析完成后,再查看以下分析:
#include<stdio.h>
int main()
{
int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};//定义了一个二维数组
printf("%d\n",sizeof(a));//此时的a在sizeof内部,代表整个数组,因此,数组内元素又为整型,故结果为:3*4*4 = 48字节
printf("%d\n",sizeof(a[0][0]));//a[0][0]代表第一行第一列的元素,其为整型,因此大小为4字节
printf("%d\n",sizeof(a[0]));//一维数组中,a就代表首元素地址,除了两种特殊情况外,
//而在二维数组中,a[0]代表的是二维数组中首元素,二维数组中的首元素为第一行;
//此时a[0]代表数组中第1行,因此,大小为4*4 = 16
printf("%d\n",sizeof(a[0]+1));//此时并非两种特殊情况,因此a[0]代表第一行的首元素地址,再加1为第一行第二个元素的地址
//地址则为4字节(32位)
printf("%d\n",sizeof(*(a[0]+1))); //第一行第二个元素的地址解引用,就是取出来1行2列的元素,整型因此为4字节
printf("%d\n",sizeof(a+1));//a相当于a[0],即二维数组中首元素也就是第一行的地址,再加1为二维数组中第二个元素也即第二行的地址
//地址为4字节
printf("%d\n",sizeof(*(a+1))); //a+1为第二行元素的地址,解引用也就是第二行所有元素,大小为4*4 = 16字节
printf("%d\n",sizeof(&a[0]+1));//a[0]:第一行首元素地址,&a[0]:代表第一行的整个数组的地址,
//再加1为第二行的地址,4字节
printf("%d\n",sizeof(*(&a[0]+1)));//对数组的第二行解引用,整型,大小为4字节*4= 16字节
printf("%d\n",sizeof(*a));//第一行解引用,4*4 = 16字节
printf("%d\n",sizeof(a[3]));
//sizeof会去访问a中到底有没有第四行,只是根据类型计算大小,因此不会报错
//a[3]代表第四行,因此大小为4*4 = 16字节
return 0;
}
其中不是很好理解的可以见下图:
编译查看结果:
和我们分析的一致,因此分析没有错误。
结构体指针练习题
下面进行结构体
的指针练习题,代码如下,请分析:
#include<stdio.h>
struct Test
{
int num;
char* pc;
short sd;
char cah[2];
short sba[4];
}* p; //定义一个结构体指针
int main()
{
p = (struct Test*) 0x00100000;//假设该指针的地址为这个地址
printf("%p\n",p+0x1);
printf("%p\n",(unsigned long)p + 0x1);
printf("%p\n",(unsigned int*)p + 0x1);
return 0;
}
再分析完成后,再查看以下内容:
#include<stdio.h>
struct Test
{
int num;
char* pc;
short sd;
char cah[2];
short sba[4];
}* p; //定义一个结构体指针
int main()
{
p = (struct Test*) 0x00100000;//假设该指针的地址为这个地址
printf("%p\n",p+0x1);//0x表示16进制,也就是结构体指针加1,将会越过整个结构体:0x00100000+4+4+4+2*1+4*4 =0x001000014
printf("%p\n",(unsigned long)p + 0x1); //将指针p强制转换为无符号长整型,再加1,可得0x00100000+1 = 0x00100001
printf("%p\n",(unsigned int*)p + 0x1);//将指针p强制转换为无符号整型指针加1,,故加4,可得0x00100000+4 = 0x00100004
//结果应该为0x100004
return 0;
}
编译运行,得到以下结果:
因此分析无误。
一维数组补充练习题
请分析以下代码,其中%x
为打印16进制的符号:
#include<stdio.h>
int main()
{
int a[4] = {1,2,3,4};
int* p1 = (int*)(&a+1);
int* p2 = (int*)((int)a + 1);
printf("%x,%x",p1[-1],*p2);
return 0;
}
再分析完成后,查看以下分析,
首先分析p1,如下图:
因此,结果将为4,接下来分析p2,如下图:
下面我们验证是否正确:
和分析的一致,因此分析正确。
上述内容即使今天的全部内容了,感谢大家的观看,至此,有关指针的练习题也基本结束了,辛苦大家了。
如果方便,辛苦大家点个赞和关注哦!
您的点赞或评论或关注是对我最大的肯定,谢谢大家!!!