地址指针加数组,这个问题很棘手---(大厂都爱考的面试题)

  本篇文章将会以图片加文字的形式,分析在指针上常考的面试题,可以很好帮助我们进一步了解指针,早日拿到大厂offer。废话不服多说现在就开始吧!

---------------------------------------------------------------------------------------------------------------------------------------------- 

 第一题:

   首先,这道题目创建了一个数组里面有5个元素,随后是一个 ptr 的指针将 &a + 1 转化为int* 类型(对于数组,数组名是首元素的地址,但是当sizeof(a),&a 取的就是整个数组的地址,其他情况情况下都是首元素的地址)明白了这一点则代表此时的 ptr 指向了这个位置。

   最后的打印为 *(a + 1) 代表 a 为首元素的地址 + 1代表向后走一位指向了 2。因此第一个答案为2;

  *(ptr - 1) 注意此时的 ptr 是int* 类型 -1 就是先前移动1个整形 所以打印的是 5

 ---------------------------------------------------------------------------------------------------------------------------------------------- 

 第二道题:

struct Test
{
int Num;
char *pcName;
short sDate;
char cha[2];
short sBa[4];
}*p;
//假设p 的值为0x100000。 如下表表达式的值分别为多少?
//已知,结构体Test类型的变量大小是20个字节
int main()
{
printf("%p\n", p + 0x1);
printf("%p\n", (unsigned long)p + 0x1);
printf("%p\n", (unsigned int*)p + 0x1);
return 0;
}

  这道题是定义了一个结构体类型它的大小是 20 个字节,定义的是*p 代表这个结构体,那么里面 p存放的就是地址,接下来一个一个打印的分析

考察重点:指针的类型决定指针的运算!!!

  (p + 0x1)是在 p 的地址上加 1 而结构体指针的大小为20个字节所以 + 1就是+ 20,0x又是16进制所以: 0x100014;

  (unsigned long) p + 0x1 是先将 p(结构体指针)类型转化为整形,那么整形 + 1就是 + 1所以是0x100001;

  (unsigned int*)p + 0x1 是将p(结构体指针)类型转化为整形指针,那么+ 1是跳过一个整形,也就是4个字节 所以: 0x100004;

 --------------------------------------------------------------------------------------------------------------------------------

----------------------

第三道题:

   我们创建了一个整形数组,里面有4个元素,(&a + 1)是整个数组的地址 + 1是跳过整个数组。初始化给了 ptr1(整形指针)。((int)a + 1)将数组类型转化为整形,a 是数组名代表首元素的地址,转化为整形时+1就是在地址上跳过一个字节(原因如图),所以最后根据数组存储为小端,又跳过一个字节的原理可知 ptr2 指向的位置

打印的 ptr1[-1] 表示先前移动一位,所以为 4

  ptr2 表示数组里跳过一个字节的位置,为 int* 类型解引用时输出后4个字节的内容,又为小端存出高字节放在高地址处 最后打印为: 0x02000000(当然不会打印前面的0x0)

 --------------------------------------------------------------------------------------------------------------------------------

----------------------------

第四道题 :

  看了前面那么多题,乍一看还挺简单的但是里面的坑特别多。有没有注意到数组里面的时 (0, 1)不敏感的同学可能反应不过来,没错这就是逗号表达式。(是不是掉坑里了,以为是二维数组)能看出来这点这道题就好做了。数组是一个3行2列的数组,定义一个指针 p 指向了a[0] 逗号表达式显示最后一个,所以是1。

 --------------------------------------------------------------------------------------------------------------------------------

--------------

第五道题:

   先是定义了一个数组(int * [5]),有定义了一个数组指针(这个指针指向4个数字,类型为整形int * [4])。将数组首元素的地址转递给了p,虽然是将地址传递,但是里面是指向了4个数组。最后一个是打印%p地址,另外一个是打印%d整形。需要打印的表达式相同。那么&p[4][2]的指向如图所示,其次指针-指针(地址- 地址)都表示的是他们之间所差的个数,为-4 而 -4 放在内存里面是以补码的形式存在,打印地址不分正负直接打印补码、打印整形需要换为源码。最后结果为 -4的补码对应的16进制数字, 另外一个为 -4。

-------------------------------------------------------------------------------------------------------------------------------- 

 第六题:

  这里的 ptr1 跟前面的一样为一开始取整个数组的地址+ 1,跳到了最后面变成整形指针 -1代表先前移动一个整形,也就是一位答案为: 10 。

  ptr2为aa 是二维数组首行的地址 +1代表指向了第二行,转化为int *类型,再- 1表示先前移动了一位,所以答案为:5;

-------------------------------------------------------------------------------------------------------------------------------- 

到此结束了我还会持续更新大厂的面试题,最后的最后,如果有什么疑问或者错误还请评论留言,我们共同进步!!如果对你有帮助还希望可以给我一个免费的赞。拜托了!😊😊😊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值