传智播客旗下技术交流社区北京校区

 找回密码
 加入黑马
在学习C语言时,指针可谓是一个较难理解的地方,为了让同学们对指针有更进一步的理解,这里传授各位同学关于通过指针取值的技巧
1. 先思考以下的指针变量,取值后会是多少
char temp[20]={11,22,33,44,55,66,77,88,99};
char *p1 = temp;
printf("*p1=%d\n", *p1);// 想想看会是多少呢?
对于上例题中的结果想必很多同学知道答案,为11(你计算对了么)
咱们简单的分析一下:因为p1是一个指针变量,即可以存储指针(即地址),而程序中把temp赋值给了p1,又因为tempchar类型数组的名字,即是下标为0的元素的地址,所以p1这个指针变量存储的是temp[0]这个元素的地址,*p1得到的结果为11,就不足为奇了
2. 接着上面的代码,再添加如下代码,
printf("*(p1+1)=%d\n", *(p1+1));
此时程序会输出多少呢?
答案为22
同样接下来咱们分析一下:因为p1保存了temp[0]这个元素的地址,即p1指向了temp[0],而p1+1的结果可以理解为temp[1]的地址,所以*(p1+1)就是取的temp[1]的值,即22
3. (预告:接下来的是重头戏)
接着上面的代码,再添加如下代码:
printf("*(char *)((short*)p1+1)=%d\n", *(char *) ((short *)p1+1));
此时程序会输出多少呢?
答案为33
啊???33???你是不是也有这样的感觉,怎么计算的呢?
下面咱们仔细分析一下这个值为什么会是33
<1> p1 在定义的时候已经进行了赋值,即初始化为temp[0]元素的地址
12313123.png
<2>根据优先级以及结合性,对应表达式*(char*) ((short *)p1+1)的计算先后顺为:先对p1进行临时性的强制类型转换,即此时p1这个指针变量的类型已经变成了short*类型;但是要注意此时p1保存的还是temp[0]元素的地址;接下来要对p1进行+1了,此时到底指向了哪里呢? 12333333.png
告诉大家一个技巧:对一个指针变量+1的时候,指针到底向后偏移多少个字节,要根据指针变量当前的类型而定,如果是char*的那么+1会向后偏移1个字节,如果是short*那么+1会向后偏移2个字节,如果是int*那么就会向后偏移4个字节(具体的要根据不同的编译器而定);
根据刚刚告诉大家的小技巧,试试看(short *)p1+1会指向哪个元素呢?
对了,此时p1指向了temp[2]这个元素,注意,因为此时p1的类型已经转换为short*,所以如果此时取值会根据p1指向的地址连续取2个字节的数据当做结果 此时肯定不是33,,,有的同学已经注意到了在最外边还有一个(char*)即类型转换,此时又把p1的类型转换为char*了,然后再取值 就会得到33



分享至 : QQ空间
收藏

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马
关闭

站长推荐 上一条 /5 下一条