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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Linux文件传输FTP详解[通俗易懂]

    Linux文件传输FTP详解[通俗易懂]ftp命令用来设置文件系统相关功能。ftp服务器在网上较为常见,Linuxftp命令的功能是用命令的方式来控制在本地机和远程机之间传送文件,这里详细介绍Linuxftp命令的一些经常使用的命令,相

  • Depix初体验

    Depix初体验前情提要这几天有一个同学给我发了一张马赛克图,问我能不能还原?图片如上。我一看,这被马成什么鬼样子了,谁能还原得了?不过我忽然想到,我在公众号上看到一个名字叫做”Depix”的Github项目。然而近期在Github上,又出现了一款号称能抹去马赛克让原图重现的神器,引发海内外热议。这款工具名为Depix,上线没几天就在GitHub上标星已超过一万多,截止目前累计分支也超过了1.3k个。让它火出圈子的,就是下面这张效果图:如图所示,第一行是打了一层巨厚马赛克完全像素化后的文本内容,看不出

  • pytest的assert_Python断言

    pytest的assert_Python断言前言断言是写自动化测试基本最重要的一步,一个用例没有断言,就失去了自动化测试的意义了。什么是断言呢?简单来讲就是实际结果和期望结果去对比,符合预期那就测试pass,不符合预期那就测试failed

  • 串口调试助手如何使用

    串口调试助手如何使用需要设置好对应的串口端口,波特率、校验位、数据位、停止位,然后打开串口。这是一个绿色版的,比深蓝串口调试助手好用的多。

  • Webserver管理系列:11、注意默认的隐含共享

    Webserver管理系列:11、注意默认的隐含共享

  • 系统架构与高可用

    系统架构与高可用

    2020年11月12日

发表回复

您的电子邮箱地址不会被公开。

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