C语言 对数组名取地址

C语言 对数组名取地址

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

作者 : 卿笃军

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

演示样例:

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

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

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


这个输出会是多少呢?

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

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

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

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

#include <stdio.h>

int main()
{
	int a[5] = {1,2,3,4,5};
	int *p = (&a+1);   

	return 0;
}

编译会出现例如以下警告(警告行数:
int *p = (&a+1);):

C语言 对数组名取地址

上面的警告也告诉我们,&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 <stdio.h>

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语言 对数组名取地址

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118799.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • c语言和python实用性_C语言和Python语言,那个更好?

    c语言和python实用性_C语言和Python语言,那个更好?(3)灵活性Python语言的最大优点在于它的灵活性,这在测试领域非常重要,因为测试所面临的业务和需求经常在变化,有时它们甚至无法满足并自行决定,而在这时,你可以使用Python丰富的第三方库轻松找到解决方案。(4)扩张Python语言除了测试行业外,如果需要,你还可以通过Python轻松访问Web开发,数据分析,自动化操作以及人工智能等领域。Python是一种动态语言,这就是为什么它易于学习,但…

    2025年7月15日
    3
  • 广度优先搜索 BFS

    广度优先搜索 BFS

    2021年8月11日
    66
  • 理解HTTP和TCP

    理解HTTP和TCP TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性。Http协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求。Http会通过TCP建立起一个到服务器的连接通道,当本次请求需要的数据完毕后,Http会立即将TCP连接断开,这个过程是很短的。所以Http连接是一种短连接,是一种无状态的连接。所谓的无状态,是指浏览器每次向服…

    2022年9月14日
    2
  • pycharm2021 3.2 激活码破解方法

    pycharm2021 3.2 激活码破解方法,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月15日
    587
  • 纵向、横向导航菜单及二级弹出菜单

    纵向、横向导航菜单及二级弹出菜单一、纵向导航菜单及二级弹出菜单首先在body中添加一个div标签,其中包含ulliul的标签结构存放网站菜单,效果如下:&lt;%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%&gt;&lt;%Stringpath=request.getContextPath();StringbasePath=…

    2022年7月26日
    13
  • Origin 2018中文版软件下载和安装教程|兼容Win10(上)

    Origin 2018中文版软件下载和安装教程|兼容Win10(上)

    2022年5月2日
    81

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号