作者 : 卿笃军

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

演示样例:

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;

}

c语言 如何对数组取地址,C语言 对数组名取地址相关推荐

  1. java swt换图标,swt通过扩展名取系统图标,swt扩展名取图标,eclipse swt可

    swt通过扩展名取系统图标,swt扩展名取图标,eclipse swt可 eclipse swt可以通过扩展名取得Program,从而取得系统图标,必须注意的是,在Linux平台下是扩展名是分大小写的 ...

  2. C语言的数组名和对数组名取地址

    *************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com ****** ...

  3. C语言数组名、数组名取地址、数组首元素地址之间的关系

    C语言中数组名a.数组名取地址&a.数组首元素地址&a[0]三者的概念有点绕,花了点时间好好琢磨了一下,将自己的理解记录下来,如有错误之处,欢迎赐教. 首先看下面的一小段代码: #in ...

  4. C语言中的数组名取地址

    今天看到这样一道题目,有点懵,记录一下 c语言中的对数组名取地址是什么意思? c中对数组名取地址,实际得到的是指向该一维数组的指针,对于上述题目中的&arr,表示指向一维数组arr的指针,*( ...

  5. 关于对C语言中数组名取地址加减等操作的一点探究

    对于数组名取地址强制转换的操作 偶然在晚上学了C语言指针后网页闲逛找题时,被一个数组名取地址搞糊涂了,在自己试验加探索后我稍微悟了一点东西. 代码如下: #include<stdio.h> ...

  6. c语言中数组名和数组名取地址理解

    1.数组名是个指针型常量,也就是值不能被改变.(指针常量和常量指针区别见本文) char *str = "hello"; char  ch[6] = "hello&quo ...

  7. 解析:数组名a、数组名取地址a、数组首地址a[0]、数组指针*p

    数组和指针向来就是傻傻分不清,当他们一起出现的时候就更加懵逼. 1 解析不同变量之间的区别: 数组名a: 数组名可以作为数组第一个元素的指针.我们由数组和指针的关系知道,a代表这个地址数值,它相当于一 ...

  8. 对二维数组的数组名取地址,a,a+1的理解

    C语言规定,数组名代表数组的首地址,也就是第0号元素的地址.所以a==&a[0] 但对数组名取地址时却要注意了,在理解"对数组名取地址"这一表达式的含义时一定要记住:数组名 ...

  9. 对数组名取地址 a[ ],a

    C语言规定,数组名代表数组的首地址,也就是第0号元素的地址.所以a==&a[0] 但对数组名取地址时却要注意了,在理解"对数组名取地址"这一表达式的含义时一定要记住:数组名 ...

最新文章

  1. 图融合GCN(Graph Convolutional Networks)
  2. 一次看懂RIP协议。
  3. c++面试题【转】 面经
  4. JAVA 获取文件的MD5值大小以及常见的工具类
  5. 亚马逊专家课 | 数据体系+用户画像+商品画像系列课(立省 299 元)
  6. bash shell 循环读入每一行(转)
  7. OpenStack、Docker、KVM被评为最火的云开源项目
  8. rust怎么不要的墙拆掉_封阳台,栏杆要不要拆掉?栏杆装在玻璃窗里面还是外面...
  9. Fire!——两个BFS
  10. Java学习笔记:进程与线程、BIO、NIO、Selector
  11. python语言在命名上是什么敏感的_一文轻松掌握python语言命名规范规则
  12. 商业智能让营销更精确
  13. 机器学习、深度学习需要哪些数学知识?✅
  14. php模拟登录京东,京东jos 获取授权及php-sdk的使用示例
  15. 事务 - TCC模式
  16. 清华大学python教材怎么样_经典!清华大学计算机系教材曝光:《Python编程金典》...
  17. 欢雀HR员工管理系统,轻松搞定员工档案管理!
  18. google与百度地图api体验笔记
  19. 裁员、转型、突围,两图带你看懂交易所困局
  20. java把一个对象赋值给另一个对象

热门文章

  1. [Python]Django模型(Model)
  2. 计算机类(计算机科学与技术)大学生职业生涯规划书
  3. Android Telephony分析(一) ---- Phone详解
  4. TelephonyTesgistry
  5. 点石成金:“硅业报国”不仅是理念
  6. 2021年下半年山东软考准考证打印时间
  7. Win11下载与安装
  8. java古诗_古诗自动生成程序JAVA
  9. 墨画子卿第一章第3节:挑衅
  10. 接上篇,记录一下【Unity 3D对博途PLCSIM的通讯】文章有点长~仔细看,很基础