C语言指针和数组笔试题

本文详细讲解了C语言中数组和指针的相关规则,包括sizeof运算符用于计算数组的总大小,&运算符获取数组的地址,以及strlen函数用于计算字符串的长度。同时,通过一系列笔试题解析了数组名作为首元素地址的概念,二维数组的处理方式,以及不同指针类型和运算对内存地址的影响。文章还涉及了小端环境下内存的处理和多维数组的边界问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先牢牢记住下面这个规则:

  1. sizeof(数组名),数组名表示整个数组。计算的是整个数组的大小

  1. &数组名,数组名表示整个数组,取出的是整个数组的地址

除此之外,所有的数组名都是数组首元素的地址

关键词:sizeof&

接下来就可以根据规则做题了:

1.整形数组:

2.字符数组:

改为strlen的情况:

要了解strlen的特性:遇到\0才终止读取

3、二维数组

int a[3][4]={0}; //二维数组

笔试题1:

ptr取到的是整个数组的地址(&a),指向数组末尾,-1后再取地址便是5;

a是首元素地址,加1再解引用便得到2。

笔试题2:

  • p是一个结构体指针,p+0x1就是在整个p上加1,加的是20个字节,转换为16进制便是0x00100014

  • unsigned long将p强制转换为一个long整型,整型加1就是加1,转换为16进制便是0x00100001

  • unsigned int*将p强制转换为一个int指针类型,指针加1要看步长,即int型为加4,转换为16进制便是0x00100004

笔试题3:

//小端,x86环境

ptr1同上题类似,为0x4,就不解释了

ptr2,首先将a转换为整型,整型+1就是+1,ptr2指向如图所示位置, 然后将其转换为整型指针后解引用,会解4个字节,因此按小端模式最终打印0x20 00 00 00

笔试题4:

首先不要被()迷惑了,它并不是{},因此数组其实为{1,3,5},即只取括号内第二个的数字

放完后的数组是这样的:

a[0]是第一行的数组名,没有与sizeof结合,没有与&结合,因此数组名就是首元素地址,即1的地址

,p[0]实则为*(p+0),即*p,即*a[0],即1

笔试题5:

解读:

-4,以地址形式打印,打印出的是补码

笔试题6:

&aa的类型是int (*)[2][5],加一操作会导致跳转一个int [2][5]的长度,直接跑到刚好越界的位置。减一以后回到最后一个位置1处。*(aa + 1)相当于aa[1],也就是第二行的首地址,自然是5的位置。减一以后由于多维数组空间的连续性,会回到上一行末尾的6处。

笔试题7:

要知道a是一个指针数组,存放的三个数据为char*类型,分别指向三个字符串的首地址;

而char** pa是说pa是一个指针指向char*这个对象,因此将a赋给它就是首元素的地址,

pa++就是跳过一个char*的对象,pa便指向at

笔试题8:

先理清关系:

打印的第一行代码,++cpp,cpp指向的是char**对象,因此跳过一个char**对象,指向了c+2的位置,再解引用,得到POINT;

第二行代码,++cpp,cpp再次跳过一个char**对象,指向了c+1的位置,c+1再--,变为c,再解引用,指向了ENTER,再加3,指向E,打印得到ER;

第三行代码,*cpp[-2]可以看成**(cpp-2),它使cpp指向c+3的位置再解引用,指向了FIRST,再加3,指向S,打印的到ST;

第四行代码,cpp[-1][-1]可以看成*(*(cpp-1)-1)+1,由于第一和第二行代码将cpp加到了c+1这个位置,cpp-1便指向了c+2这个位置,解引用得到c+2,再减一变为c+1,再解引用指向NEW,+1指向E,打印出EW

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值