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


相关推荐

  • 2021爱智先行者——EdgerOS Spirit 1深度使用体验与EdgerOS应用开发实践「建议收藏」

    一、前言①智能边缘计算操作系统EdgerOS是为万物互联时代而生的智能操作系统。为广大开发者提供基于互联网技术栈的操作系统平台,极大简化了物联网App开发难度,提高开发效率。通过爱智云,EdgerOS为开发者提供了强大的云-边-端协同能力,开发者无需关心设备是本地还是远程连接,EdgerOS能够无缝切换,给用户带来丝滑的使用感受,实现“多用户-多终端-多设备”的实时连接与互动。EdgerOS是下一代面向物联网和边缘计算的智能操作系统,可广泛应用于面向个人、家庭和行业的物联网产品和解决方

    2022年4月10日
  • 阿里云申请免费DV SSl(https证书),及详细配置运用[通俗易懂]

    阿里云申请免费DV SSl(https证书),及详细配置运用[通俗易懂]概述(大体流程):申请好免费证书后,一键推送到负载均衡,然后再给负载均衡配置443端口监听,并选择相应的证书!1、在阿里云购买证书说明:免费版的只能针对特定的一个域名(如果有多个域名,那就多买几个免费的)注意:在里面挨个挨个点乱点,这个免费的隐藏得有点深,不容易出的来(Symantec里面才有免费版的)创建证书,在【证书列表】中选择自己购买的那个2、配置证书…

    2022年10月1日
  • cmd批处理命令~%dp0与~%dpn1的解析

    cmd批处理命令~%dp0与~%dpn1的解析1、最简单的做法是在cmd命令输入:for/?,回车,就能看到详细的解析对一组文件中的每一个文件执行某个特定命令。FOR%variableIN(set)DOcommand[command-parameters]%variable指定一个单一字母可替换的参数。(set)指定一个或一组文件。可以使用通配符。command指定对每个文件执行的命令。…

    2022年9月16日
  • C++ Primer笔记7_STL之关联容器

    C++ Primer笔记7_STL之关联容器

    2022年1月20日
  • 线程池ThreadPoolExecutor简介[通俗易懂]

    线程池ThreadPoolExecutor简介[通俗易懂]1前言线程池是并发编程中一个重要的概念和技术。大多数异步或并发执行任务都会用到线程池。线程池,正如其名,它是有一定数量的线程的池子,它会执行被提交过来的任务,执行完一个任务后不会马上结束,它们会

    2022年7月4日
  • acm博弈论经典模型_博弈论分析

    acm博弈论经典模型_博弈论分析基本覆盖了比赛中常用到的博弈论知识点,之前整理的,最近要开始系统的看博弈论,先找出来复习一下。

    2022年10月10日

发表回复

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

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