指针进阶学习(3)-指针笔试题

1、

int main()
{
    int a[5] = { 1, 2, 3, 4, 5 };
    int *ptr = (int *)(&a + 1);  //&a表示数组地址,加一即跳过整个数组后的地址,经过强类型转换赋给ptr
    printf( "%d,%d", *(a + 1), *(ptr - 1)); //a为数组名表示首元素地址,加一即第二个元素地址,解引用即第二个元素2. //ptr指向整个数组后面,减一即指向元素5,解引用就得到5.
    return 0;
}

打印2,5

2、

struct Test
{
   int Num;
   char *pcName;
   short sDate;
   char cha[2];
   short sBa[4];
}*p;      //p为结构体指针
//假设p 的值为0x100000。 如下表表达式的值分别为多少?
//已知,结构体Test类型的变量大小是20个字节(20的十六进制为14)
int main()
{

   p = (struct Test*)0x100000;
   printf("%p\n", p + 0x1); //0x1为十六进制的1,p+1跳过整个结构体所以地址加二十为0x00100014
   printf("%p\n", (unsigned long)p + 0x1); //强类型转换p为长整型为1048576(十进制)再

                                                                //加一为1048577再打印出地址(十六进制)0x00100001
   printf("%p\n", (unsigned int*)p + 0x1);  //强制转换为无符号整形指针为加一跳过一个无符号整形  
                                                                 //指针(四个字节)-0x00100004

  return 0;
}

3、

int main()
{
   int a[4] = { 1, 2, 3, 4 };
   int *ptr1 = (int *)(&a + 1); //&a为数组地址+1跳过了整个数组
   int *ptr2 = (int *)((int)a + 1); //把首元素地址转换为整形(十进制)加一再转换整形指针(十                                                   //六进 制),其实相当于地址十六进制加一,此时跳过了一个字节
   printf( "%x,%x", ptr1[-1], *ptr2); //此时ptr1指向整个数组后面,而ptr1[-1]=*(ptr1-1)即减一指向
   return 0;   //数组最后一个元素再解引用为4.而ptr2为整形指针,跳过一个字节后打印四个字节。
}      //而prt2的位置如下图,因为当前环境是小端存储所以低位在低地址,ptr2指向了01后面,所以打印2000000.

 

4、

#include <stdio.h>
int main()
{
   int a[3][2] = { (0, 1), (2, 3), (4, 5) };  //此处为逗号表达式最后为1,3,5后面补0填满数组
   int *p;
   p = a[0];  //a[0]为首元素地址,所以打印1
   printf( "%d", p[0]);
   return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

优雅人字拖

老板大气

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值