博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言 对数组名取地址
阅读量:5813 次
发布时间:2019-06-18

本文共 925 字,大约阅读时间需要 3 分钟。

作者 : 卿笃军

你有没有想过,对一个一维数组名取地址,然后用这个地址进行加减运算。这会出现什么样的结果呢?

演示样例:

int a[5] = {1,2,3,4,5};

int *p = (int *)(&a+1);

printf("%d\n",*(p-1));

这个输出会是多少呢?

咦?为什么第二行须要强制转化类型呢?

答:a是一个一维数组的名字,&a相当于一个指向一维数组的指针。怎么感觉这么熟悉?指向数组的指针,那不就是行指针吗?int (*p)[]。

行指针+1,就是对指针进行加减操作,其结果还是一个行指针~~~原来如此,须要强制转换为单指针。

能够看一段代码,例如以下:

#include 
int main(){ int a[5] = {1,2,3,4,5}; int *p = (&a+1); return 0;}
编译会出现例如以下警告(警告行数:
int *p = (&a+1);):

上面的警告也告诉我们,&a是一个行指针~~~

那么,输出结果是多少呢?

答:当然是5。

为什么?

答:上面不是说了嘛,&a就是一个行指针,那就是指向一行的指针咯。行指针+1,不就指向下一行了,这里一行为[5]个,那么int *p = (int *)(&a+1)就要在a的基础上偏离5个位置:(例如以下:上一行表示偏离位数,下一行表示a[]中相应的数据)

0  1  2  3  4  5  

1  2  3  4  5  *

咦,这不是越界了吗?移动五位都跑出a[]数组处于' * '号位置了。哦,我看到printf()输出了。你输出的是*(p-1),这里p是一个单指针-1就是往左位移一位即可了,那不就是又回到5的位置了吗?原来是这样,输出结果是5 。

以下我们用一段代码来显示位移情况~~~

#include 
int main(){ int a[5] = {1,2,3,4,5}; int *p = (int *)(&a+1); //+1相当于移动了5位 printf("%p\n%p\nbit = %d\n",a,p,p-a); printf("%d\n", *(p-1)); return 0;}

你可能感兴趣的文章
Linux 目录结构及内容详解
查看>>
startx命令--Linux命令应用大词典729个命令解读
查看>>
华为3026c交换机配置tftp备份命令
查看>>
Oracle命令导入dmp文件
查看>>
OCP读书笔记(24) - 题库(ExamD)
查看>>
Http、TCP/IP协议与Socket之间的区别(转载)
查看>>
解决Unable to load R3 module ...VBoxDD.dll (VBoxDD):GetLastError=1790
查看>>
.net excel利用NPOI导入oracle
查看>>
vrpie在Visio Studio 中无法调试的问题
查看>>
第六课:数据库的基本工具
查看>>
关于二叉树重构的思索
查看>>
$_SERVER['SCRIPT_FLENAME']与__FILE__
查看>>
skynet实践(8)-接入websocket
查看>>
系统版本判断
查看>>
My97DatePicker 日历插件
查看>>
0603 学术诚信与职业道德
查看>>
小点心家族第3位成员——楼层定位效果
查看>>
Knockout.Js官网学习(enable绑定、disable绑定)
查看>>
hive基本操作与应用
查看>>
excel快捷键设置
查看>>