深入理解指针、指向数组的指针和数组名的的区别

流媒体学习之路(mediasoup)——simulcast 与 svc 简介(7) 流媒体学习之路(mediasoup)——simulcast 与 svc(7) 文章目录流媒体学习之路(mediasoup)——simulcast 与 svc(7) 阅读详情

首先我们来看一段程序:

#include <stdio.h>

int main(int argc,char *argv[])
{
        int numbers[5] = {1, 2, 3, 4, 5};
        printf("&numbers: %p\n", &numbers);
        printf("&numbers+1: %p\n", &numbers+1);
        printf("numbers: %p\n", numbers);
        printf("numbers+1 :%p\n", numbers+1);

        int *p = numbers;
        printf("sizeof(&numbers): %d\n", sizeof(&numbers));
        printf("sizeof(numbers): %d\n", sizeof(numbers));
        printf("sizeof(*numbers): %d\n", sizeof(*numbers));

        printf("sizeof(*p): %d\n", sizeof(*p));
        printf("sizeof(p): %d\n", sizeof(p));

        return 0;
}

这段程序的输出结果:

下面来分析输出结果:

我们先来分析 numbers 和 &numbers:

  1.首先,用%p将 numbers 和 &numbers打印出来,它们的地址自然都是一样的,因为它们都等于数组的首地址。 但是,我们将它们的地址+1后打印出来,结果却大相径庭。那么,这是为什么呢?

  其实,虽然 numbers 和 &numbers 都代表数组首地址, 但是它们所指向元素的类型却是不一样的。&numbers 所指向的类型是int [5] 型的数组,占据5*sizeof(int) = 20 个字节。而numbers 指向的类型是 numbers[0] 这种 int 类型数组的成员,注意,是成员不是整个数组!它的 大小只有 sizeof(int) = 4 个字节。所以它们的地址+1后, 与原地址相差分别为20和4。

 

 2.接下来,我用 sizeof 对 &numbers, numbers, *numbers 求长度。结果分别为8,20,4。经过分析, &numbers 是一个地址,在64位下经 sizeof 输出为8, 这个并无疑问。

但是,sizeof(numbers) 结果等于20, 却与上面的分析相悖,其实这里有个很重要的点就是, 数字名并不是指针! 虽然数组名可以在很多时候作为指针来使用,如上文中所说

numbers 指向类型为 int的数组成员, 但是在用于 sizeof 时, numbers 是作为它的本身数组名来使用, 它指向的实体其实是一种数据结构,这个结构就是数组。所以 numbers

进行求长度操作,等价于对数组求长度,结果自然是20。而后面对 sizeof(*numbers) 等价于 sizeof(*(numbers+0)),即对 numbers[0] 求长度,它的结果是sizeof(int) = 4。

  总而言之,我们一定要认识到,数组名不是指针!虽然数组名很多时候可以作为指针来使用(如在上文1中),但要在进行 sizeof 这种操作时, 数组名本来的意义就体现了,

它所代表的就是数组这种数据结构。

 

 3.另外还有一种错误的认识,就是想要求数组长度时,千万不能对指向数组的指针求长度!

程序中指针变量p指向数组首地址, sizeof(*p) 等价于 sizeof(numbers[0],结果为 sizeof(int) =4。

而 sizeof(p) 呢, p是一个指针变量,对一个指针变量求长度,更不能代表对数组求长度,它的结果在64位下就是一个地址的长度,为8个字节。

华为OD机试真题 新系统 2026-05-13 Python&JS语言 实现【查找能被整除的最大整数】 给定一个字符串和一个正整数,字符串由大小写字母和数字组成,要求从字符串中找出最大且能被给定正整数整除的数。 阅读详情

相关推荐

MatterPort3D 数据集下载

【代码】MatterPort3D 数据集下载。

qq_44106838的博客 6781

C语言 在引用数组元素时指针的运算

1.在一定条件下是允许对指针进行加和减的运算的。 **当指针指向数组元素时**,可以对指针进行加和减运算,比如:当指针变量p指向数组元素a[0],我们希望用p+1表示下一个元素a[1]。 2.**当指针已指向一个数组元素时**,可以对指针进行以下运算: (1)加一个整数(用+或+=),如p+1; (2)减一个整数(用-或-=),如p-1; (3)自加运算,如p++,++p; (4)自减运算,如p- -,- -p; (5)两个指针相减,如p1-p2(只有p1和p2都指向同一数组中的元素时才有意义)。

NuYoaH502329的博客 1005

AI人工智能与TensorFlow的教育科技应用

随着科技的飞速发展,AI人工智能在各个领域都展现出了巨大的潜力,教育领域也不例外。本文章的目的在于深入探讨AI人工智能与TensorFlow在教育科技中的具体应用,包括智能教学系统的开发、学生学习情况的评估与预测等方面。范围涵盖了从基础概念到实际项目应用的各个层面,旨在为教育科技工作者和相关研究者提供全面且深入的技术指导。本文将首先介绍AI人工智能和TensorFlow的核心概念及其联系,让读者对相关技术有基本的了解。接着详细讲解核心算法原理和具体操作步骤,并结合数学模型和公式进行深入分析。

AI智能探索者的博客 1697

数组名和指针的区别

数组名和指针之间,经常会交替使用这两个变量,比如,把一个指针当成数组来使用,或者是把数组名赋值给指针,通过指针来访问数组成员变量,但是,数组名和指针之间到底有什么样的联系与区别,以及什么情况下该使用指针,什么情况下该使用数组名,我对这个做一个小小的解读。。 上图中,定义一个数组,数组名为arr,分别打印arr本身的地址,arr首元素的地址,以及arr本身,以整型形式输出,发现,这三者的值是相同

findgeneralgirl的博客 2万+

Trae AI开发工具:大前端环境配置与避坑指南

大前端开发的第一步往往不是选框架,而是搭建一套可靠的工具链。IDE作为编码、调试与AI能力协同的载体,直接决定后续开发的顺畅度。传统编辑器需要手动拼装插件生态,而新一代AI开发工具将对话、代码生成与项目脚手架能力内置到编辑器底层,降低了环境准备的门槛。Trae基于VS Code内核,兼容其插件体系,同时提供Chat、Builder、内联对话三种AI交互模式,适合从VS Code迁移的开发者,也适合大前端新人快速上手。安装时需认准官方渠道,注意Node.js、Git版本联动,配置自动格式化与手动更新策略,并结

weixin_26833139的博客 281

YOLO详解

本文参考知乎 https://zhuanlan.zhihu.com/p/25236464 1. YOLO的创新点 YOLO将物体检测作为回归问题求解。基于一个单独的end-to-end网络,完成从原始图像的输入到物体位置和类别的输出。 从网络设计上,YOLO与two steps的目标检测方法如RCNN、Fast RCNN和Faster RCNN的区别如下: YOLO训练和检测均是在一个单独网...

UnknownPlayer的博客 9949

数组指针——指向数组对象的指针

转载自:数组指针 数组指针——指向数组对象的指针 数组(Array)是一系列具有相同类型的数据的集合,每一份数据叫做一个数组元素(Element)。数组中的所有元素在内存中是连续排列的,整个数组占用的是一块内存。以int arr[] = { 99, 15, 100, 888, 252 };为例,该数组在内存中的分布如下图所示: 定义数组时,要给出数组名和数组长度,数组名可以认为是一个指针,它指向...

weixin_43814616的博客 5014

AI应用架构师进阶:智能控制系统架构的多Agent设计

本文将从“AI应用架构师”的视角,系统讲解智能控制系统中多Agent架构的设计方法。理解多Agent系统的核心特性与在智能控制场景中的优势;掌握多Agent架构的设计流程:从需求分析到角色划分、通信设计、决策实现;通过实战案例(智能家居控制场景),手把手带你落地一个多Agent智能控制系统;探讨进阶话题:动态Agent组织、安全性设计、与大语言模型(LLM)的融合等。在多Agent系统中,Agent(智能体)是具备自主决策能力的最小执行单元。

小程序开发 1085

从编译器角度分析C语言中数组名和指针的区别

数组名和指针是两个往往很容易让人们混淆的概念,很多人以为数组名就是一个指针,也有很多人知道数组名不同于指针但是仅知道数组名的值不能像指针一样改变,例如你可以写出下面这样的代码:int*p; p++;却不能写这样的代码:int a[]; a++;那么数组名跟指针之间到底有什么区别呢?第一,在声明上,除了作为函数参数的数组名总是编译器转化成指针,其他情况下,数组名就是数组名,指针就是指针,二者不能混淆,你不能在一个文件中定义一个数组,而在另一个文件中把它声明成一个指针。char a[];//定义一个数组a

宝宝 2374

YOLOv5改进有效涨点目录 | 包含卷积、主干、检测头、注意力机制、Neck上百种创新机制

Hello,各位读者们好本专栏自开设两个月以来已经更新改进教程60余篇其中包含C2f、主干、检测头、注意力机制、Neck多种结构上创新,也有损失函数和一些细节点上的创新。同时本人一些讲解视频和包含我所有创新的YOLOv8文档并不能在优快云上传(所有的创新点都经过我的测试是可用的,得到该文件之后大家可以随意组合使用),所以会建立群的形式在内上传我的文件和视频我也会在群内不定期和大家交流回答大家问题,同时定期会更新一些文章的创新点(经过我融合测试后的,先到先得)。本专栏持续更新网络上的所有前沿文章。

Snu77的博客 3万+

ANSYS WORKBENCH——参数化建模以及参数优化(结果导出为Excel)

目录 1、打开软件workbench 2、找到static structure,双击打开 3、选择材料 4、参数化建模 ​ 注:印记面的创建 5、模型属性设置 注:设置优化目标 6、回主界面,选择direct optimization模块 1、打开软件workbench 2、找到static structure,双击打开 3、选择材料 4、参数化建模 至此参数化建模就已经完成啦 注:印记面的创建 印记面一般是一个虚拟的区域,参与实际的网格划分,但是只是由于载.

python_AI_fans的博客 1万+

数组名和指针(这里为指向数组首元素的指针)区别?

二者均可通过增减偏移量来访问数组中的元素。 数组名不是真正意义上的指针,可以理解为常指针,所以数组名没有自增、自减等操作。 当数组名当做形参传递给调用函数后,就失去了原有特性,退化成一般指针,多了自增、自减操作,但sizeof运算符不能再得到原数组的大小了。 ...

weixin_46269257的博客 594

TPAMI 2024 | MO-MIX:基于深度强化学习的多目标多智能体协同决策

深度强化学习(RL)已被广泛应用于解决复杂的决策问题。在许多现实世界的场景中,任务通常有多个相互冲突的目标,并且可能需要多个智能体进行合作,这些是多目标多智能体决策问题。然而,在这个交叉领域的研究工作还相对较少。现有的方法仅限于单独的领域,并且只能处理具有单一目标的多智能体决策,或者具有单一智能体的多目标决策。在本文中,我们提出了MO-MIX来解决多目标多智能体强化学习(MOMARL)问题。我们的方法基于集中训练与分散执行(CTDE)框架。

小白学视觉 1129

什么是C++中的指针和引用?它们有什么区别?/ 数组名和指针(这里为指向数组首元素的指针)区别?

首先,从类型上看,数组名表示整个数组本身,是一个不可修改的常量指针,它包含的是数组第一个元素的地址。再者,从操作上看,数组名作为常量指针,不能作为左值被赋值,但可以通过下标进行索引来访问和修改数组的元素。总的来说,数组名和指向数组首元素的指针虽然有时可以互换使用,但它们在类型、大小、操作和内存布局等方面存在明显的区别。在C++中,指针和引用都是重要的概念,它们用于处理内存地址和变量之间的关系,但两者之间存在明显的区别。最后,从内存布局上看,数组在内存中占据一块连续的空间,而指针则只占据一个存储地址的空间。

wssc63262的博客 385

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

拿捏C指针

pfun1先和*结合,说明pfun1是指针,指针指向的是一个函数,指向的函数无参。那要把函数的地址存到一个数组中,那这个数组就叫函数指针数组,那函数指针的数组如何定义呢?数组的地址+1,跳过整个数组的大小,所以&arr+1相对于&arr的差值是40。根据上面的代码我们发现,其实&arr和arr,虽然值是一样的,但是意义应该不一样的。实际上&arr表示的是数组的地址,而不是数组首元素的地址。在《初步拿捏C指针》章节我们也学了指针数组,指针数组是一个存放指针的数组。能够指向浮点型数据的指针。......

yanxiang3306 2476

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C/C++数组本质论

C/C++数组本质论 理解数组名 注:为方便讲解,本节所说的指针的类型,指的是指针指向的类型。 1.对数组名的简单理解 数组名表示的是数组的首地址。比如一维数组int a[11]的数组名a就表示数组的首地址。这里的首地址让人产生误解,认为数组名表示的是整个一维数组的地址,其实数组名指向的是数组中第一个元素地址的指针(即a指向的地址是&amp;a[0]),表示整个数组的地址是&amp;a,&amp;...

黄邦勇帅的博客 1158

C语言数组的一些问题

我们都知道,数组名可以当成一个指针,同样的函数名也可以当成一个函数指针,指向函数的入口地址。现在有一个问题,数组名这个指针指向的是什么呢?如果对数组名再取地址,得到的又是什么呢? 我们来验证这两个问题。 输入以下代码: #include "stdio.h" int main() { int a[3]={1,2,3}; //int(*p)[3]=a; printf("%d

xxjoy_777的专栏 377

C语言深度剖析指针

数组指针是指针?还是数组?答案是:指针。我们已经熟悉:整形指针: int * pint;能够指向整形数据的指针。浮点型指针: float * pf;能够指向浮点型数据的指针。那数组指针应该是:能够指向数组的指针。但是下面的代码,哪个是数组指针呢?//p1, p2分别是什么?通过上面对指针数组的学习,我们知道int *p1[10]是指针数组。那么int (*p2)[10]为数组指针。指向的类型为数组,该数组的元素个数为十个,数据类型为int。

weixin_67596609的博客 886

c语言 char *p 数组p,关于:char (*p)[10] 、char p[10]和char *p[10]的讨论

发现自己C语言基础有漏洞,果断和大家讨论下:直观理解:1. char(*p)[10] 是指向数组的指针。2. char p [10]是一个数组p。3. char *p [10] 是指针数组,数组元素是char *指针。具体的不同点:1.指向数组的指针char(*p)[10] 中,p指向的是一个10个char大小的数组,p+1 和 p 的差距是 sizeof(char p [10]),p+1已指到...

weixin_39576018的博客 2829

经典的一道题目.

void main(){ int   a[5]={1,2,3,4,5}; int   *ptr1=(int   *)(&a+1); int   *ptr2=(int   *)((int   )a+1); printf("%x/n",(int   *)((int   )a+1));printf("%d,%d,%d,%d/n",a,&a,a+1,&a+1);printf("%x,%x",ptr1[-1

gaoliang0807的专栏 372

【C语言】指针数组和数组指针的区别

的情况就更好理解了,在这里“()”的优先级比 “[ ]” 高,“ * ”号和 p2 构成一个指针的定义,指针变量名为 p2,int 修饰的是数组的内容,即数组的每个元素。p1 先与 “[]” 结合,构成一个数组的定义,数组名为 p1,int *修饰的是数组的内容,即数组的每个元素。指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身的大小决定,每一个元素都是一个指针,在 32 位系统下任何类型的指针永远是占 4 个字节。指针数组可以说成是”指针的数组”,首先这个变量是一个数组。

猫猫的小茶馆 5831

【C语言】指针和数组的深入理解(第二期)

本期主要讲解: 1、数组的概念 2、数组的内存布局 3、数组名到底是什么? 4、数组名做左值和右值的区别 5、以指针的形式访问和以数组的形式访问 6、为什么C语言要把指针和数组元素访问互通呢?...............

程序猿教你打篮球的博客 7338

【C语言】指针(2):探索数组名和指针数组

通过深入理解指针(1),我们对指针有了一个初步的了解,还了解了指针变量类型的意义、指针的运算、assert断言、const修饰变量、野指针………………下面我们继续深入学习。

2302_81115588的博客 1554

深入理解指针Part3——指针与数组

本文主要探讨了C中指针与数组的核心概念及应用。首先解析了数组名的本质,指出其通常转换为指向首元素的指针,但存在sizeof和&两个例外情况。接着说明如何使用指针访问数组元素,并揭示了一维数组传参时实际传递的是首元素地址的本质。文章还提供了冒泡排序的代码实现,包括优化版本。此外,详细介绍了二级指针的操作和指针数组的概念,最后演示了如何用指针数组模拟二维数组的效果。全文深入浅出地讲解了指针与数组的关系及其实际应用场景。

BlackQid的博客 1537

【C语言】—— 指针三 : 参透数组传参的本质

对数组传参有疑惑?看这篇文章就够啦!

yusjushd的博客 2145

深入理解指针(2)

1. 数组名的理解在上一篇深入理解指针(1)中我们已经初步了解指针地址;指针的解引用;指针变量类型作用,指针运算等知识,接下来我们将继续学习指针的相关内容,一起加油吧!!!1. 数组名的理解在之前的学习中我们知道可以将一串数字存放在整形指针当中,而且指针在内存当中存放是连续的,就可以通过取地址的方式找到数组当中想要的元素在之前还提到过在函数实参中数组名表示首元素的地址,那在指针中这样规律是否还适用呢?通过以上代码发现&arr[0]与arr的地址是相同的,因此可以得出那是在所有条件下都成立吗?

mljy.博客 1937

二维数组与数组指针详解

二维数组 深入理解二维数组 首先定义一个二维数组 int a[2][3]={{1,2,3},{4,5,6}}; #or int a[2][2]={1,2,3,4}; 新的理解:我们可以这样认为,a可以看作是一个一维数组,包含2个元素,每个元素恰好是包含3个整型的元素,a这个名字的值成了指向一个包含3个整型元素的数组的指针(你学过数组指针就该知道,他们是一个道理,后面我会讲解数组指针) 然后开始讨论二维数组和数组名的关系 a表示的是整个数组的首地址,a[0]表示的是第一行的首地址,这两者在数值上是一

weixin_44810857的博客 4854
上一篇: 前置和后置++运算符的重载
下一篇: 关于字符串指针的一些问题及字符串的左旋转代码
FreeeLinux
博客等级 码龄11年 421粉丝 356原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值