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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 安装VS2005 SP1之后无法更改或卸载VS2005的处理方法

    安装VS2005 SP1之后无法更改或卸载VS2005的处理方法经历千辛万苦装上VS2005之后,一直相安无事,但今天想调整一下VS2005的安装项,于是麻利的调出控制面板–>添加删除程序,选中VS2005点“更改/删除”按钮,发现在加载安装控件的时候爆出一个错误,说是VS_Setup.MSI文件找不到,我按照提示所说的路径,即本机的安装位置,发现确实没有,于是又拿出安装盘来点Setup,结果还是说VS_Setup.MSI文件找不到,这次提示的位置是安装

    2022年10月5日
    4
  • java(3)-深入理解java异常处理机制

    java(3)-深入理解java异常处理机制1.引子try…catch…finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解。不过,我亲自体验的“教训”告诉我,这个东西可不是想象中的那么简单、听话。不信?那你看看下面的代码,“猜猜”它执行后的结果会是什么?不要往后看答案、也不许执行代码看真正答案哦。如果你的答案是正确,那么这篇文章你就不用浪费时间看啦。pa

    2022年5月12日
    34
  • 如何修改bt tracker服务器,bt tracker服务器

    如何修改bt tracker服务器,bt tracker服务器bttracker服务器内容精选换一换云审计服务支持删除已创建的追踪器。删除追踪器对已有的操作记录没有影响,当您重新开通云审计服务后,依旧可以查看已有的操作记录。DELETE/v1.0/{project_id}/tracker无无无请参见错误码。本文操作介绍使用Linux操作系统的HECS(云耀云服务器)安装宝塔面板。宝塔面板是一款使用方便、功能强大且终身免费的服务器管理软件,支持Linux…

    2022年6月29日
    37
  • 3运放差分放大电路_集成运放差分放大电路

    3运放差分放大电路_集成运放差分放大电路三运放差分放大电路三运放差分放大电路时间:2009-07-2621:23:25来源:资料室作者:三运放差分电路如图所示的同相并联三运放结构,这种结构可以较好地满足上面三条要求。放大器的第I级主要用来提高整个放大电路的输入阻抗。第II级采用差动电路用以提高共模抑制比。图三运放差分放大电路电路中输入级由A3、A4两个同相输入运算放大器电路并联,再与A5差分输入串联的三运放差动放大电…

    2025年8月5日
    5
  • 51单片机rc522程序_51单片机usb驱动

    51单片机rc522程序_51单片机usb驱动最近在某宝上买了一块RC522模块,试玩了下,读写卡正常。想学习使用新的东西时,有必要了解它的工作原理和工作过程,不清楚或者不知道的可以参考相关数据手册和参考文献,在这里为了节省自己的时间,我只对我的51程序做一个小小的笔记~~想要驱动RC522模块对IC卡(这里用的是M1卡型号是S50)进行读写操作,一定要有以下5个步骤:一、寻卡二、防冲突三、选择卡四、验证扇区密码(每个扇区都有密匙A…

    2026年1月21日
    4
  • java-version未找到命令_org.apache.catalina.core.stand

    java-version未找到命令_org.apache.catalina.core.standspringboot2.x工程,将jasypt升级到3.x–>3.0.3后,配置一个属性为加密,工程启动后报错如下############################################################

    2022年9月26日
    4

发表回复

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

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