C语言-数组名真的不是指针

人体检测技术之TOF 智能人脸/视频锁领域的人体检测需求是要求远距离达到1m左右即可,一旦在此距离内检测人,则锁唤醒进行人脸识别,视频录制等操作。所以,人体检测技术非常关键。选型主要是几个维度:1.支持检测的距离范围,能否准确输出距离信息2.支持检测FOV3.场景适应性如何,如人体衣服颜色4.环境适应性如何,夏天高温环境下的测距是否准确5.批量一致性情况。 阅读详情

1 前言

参照我之前的两篇文章:
二维数组做函数的参数
动态创建二维数组

事实告诉我们,二维数组名不等于二级指针

2 关于一维数组

对于一维数组,用一级指针指向数组名,用一级指针做参数传递一维数组,似乎毫无问题。

void f(int *p);
int main(void)
{
    int arr[2];
    int *p = arr;
    f(arr);
    return 0;
}

3 sizeof运算符和自增运算符

1、sizeof 指针是指针的大小,sizeof 数组名是整个数组的大小

int *p;
int arr[4];
printf("sizeof(p) = %d \n", sizeof(p));
printf("sizeof(arr) = %d ", sizeof(arr));

Output:
sizeof(p) = 8
sizeof(arr) = 16

2、指针可以递增操作,而数组名不可以

int arr[4] = {1, 2, 3, 4};
int *p = arr;
printf("*(++p) = %d", *(++p));	// Output:*(++p) = 2
printf("*(++arr) = %d", *(++arr));	   // error

Output error:
error: lvalue required as increment operand

这里出现了两个问题:

  1. 数组名不能递增,那数组名可能是常量指针啊 int *const arr
  2. 根据错误提示,数组名是不能作为左值的,数组名只能作为右值

4 数组名也不是常量指针

1、常量指针可以作为左值,而数组名不可以:

int i = 1;
int arr[2];
int *const p = &i; 	// OK
arr = &i;	// error

事实上,查阅资料可以发现:

  1. 数组的类型是 type[SIZE] (二维数组的类型是type(*)[SIZE])
  2. 常量指针的类型是 type* const

两者并不是同一种数据类型,关于这一点:
我个人认为在C语言中,数组也是一种数据类型,一种特殊的数据类型
我们知道,在向函数传递二维数组的时候,我们使用了数组指针,即int (*p)[n]
而数组指针,我们可以理解为C语言为数组创造的一种特殊的指针类型。

2、观察下面例子,详细内容可以参见 这里

printf("%#x \n", a);
printf("%#x \n", &a);
printf("%#x \n", &a[0]);
printf("%#x \n", &a[0][0]);

Output:
0x9ffe40 
0x9ffe40 
0x9ffe40 
0x9ffe40

我们可以发现,对于数组名,处于不同类型下,取得的值(地址)都是一样的
这个例子的意思是,数组名和指针存在着隐式转换。
这也是很多人把数组名当作指针的原因,因为数组名在大多数的情况下都会隐式转换为指针,由于数组名只能作为右值,所以指针也是一个右值的指针。

既然大多数情况下会隐式转换为指针,那么下面就是少数情况(不会转换为指针):

  1. 对数组名取地址的时候
  2. 用sizeof运算符运算的时候
  3. 用字符串字面量初始化数组的时候

5 总结

在C语言中,数组名确实和指针有着微妙的关系
但是数组名并不是指针,由于它大部分情况下都表现为一个指针
所以很多地方都认为它是指针,事实上并不是,它只是很像指针而已
我个人认为数组是C语言中一种特殊的数据类型,有着特定类型的指针。

【AutoSAR CAN】04 - 如何使用Davinci Configurator Pro工具配置CAN的波特率 改参数为Tx Arbitration start delay value ,可用于延迟仲裁过程的起始点,用来补偿CAN收发器及线路的传输延迟,以优化传输性能。有关详细信息,请参阅硬件手册。该参数指定采样点模式,即选择多少个采样点的数量,如果选择了每比特三个样本选项,则该点标记第三个样本的位置;我们要配置CAN的波特率,其实就是要弄明白 CAN 控制器的位时序即可,具体的理论部分和EB的配置部门可参考文章《该参数表示传播延迟有多少个时间单位Tq,即上文中的Propagation delay/PROGSEG。. 阅读详情

相关推荐

使用3dmax Morpher制作Unity表情动画

关于游戏人物的面部表情动画 方案一:如果面部骨骼数丰富的话,可以直接做骨骼动画 方案二:采用变形器(3dmax是Morpher,maya是blendshape)修改相应通道的权重值来做表情动画 本文简述方案二的做法。 说明:本文截图中3dsMax版本为2017。笔者第一次使用3dsMax,欢迎指正。 3dmax中导入人物模型,选择需要变形的对象,即head。当前对象附带skin信息。 ...

写作帮助思考 2万+

数组名不等于指针---sizeof()函数求数组大小错误问题

前言: 今天在项目中需要求采样点的数量并且遍历,采样点用数组存储,自定义了一个函数想要用sizeof求其长度,然后遍历,结果失败了,查阅之后发现以下问题: 在main函数中,sizeof是可以正常工作的 #include <stdio.h> int Number[10]; int main() { int size = sizeof(Number); printf("数组大小为:%d\n",size); int len = sizeof(Number)/sizeof(int).

Z小旋 3322

【全开源】教育培训微信小程序源码(FastAdmin+ThinkPHP+Unipp)

教育培训微信小程序源码以其便捷性、互动性、安全性等优势,成为了教育培训行业的新宠。随着移动互联网技术的不断发展,教育培训微信小程序源码将继续引领未来学习趋势,为学员提供更加优质、高效的学习体验。同时,教育培训机构也应积极拥抱小程序技术,利用源码打造具有自身特色的学习平台,提升品牌影响力和市场竞争力。

2401_84414018的博客 2097

C语言数组指针

arr 本身就是一个指针,可以直接赋值给指针变量 p。arr 是数组第 0 个元素的地址,所以;也可以写作。也就是说,arr、p、&arr[0] 这三种写法都是等价的,它们都指向数组第 0 个元素,或者说指向数组的开头。再强调一遍,“arr 本身就是一个指针”这种表述并不准确,严格来说应该是“arr 被转换成了一个指针”。如果一个指针指向了数组,我们就称它为数组指针(Array Pointer)对指针变量进行加法和减法运算时,是根据数据类型的长度来计算的。

AnChenliang_1002的博客 5458

qt下使用grpc编程(2) —— 练手!自己改的一个简单小例子!1

(1)在研究了grpc官方提供的helloworld例程后,自己试着写了个小程序。 (2)编写proto文件。 proto文件用于定义服务和消息,用protobuf的语法编写,protobuf是一种通信协议,详细请百度。下面附上源码: syntax = "proto3"; option java_multiple_files = true; option java_pac

u011099079的博客 3924

想在瑞芯微RK3588上跑视频分类模型?避开3D卷积这个坑,试试这几种NPU友好的方案

本文探讨了在瑞芯微RK3588上部署视频分类模型时如何避开3D卷积的性能陷阱,提供了三种NPU友好的替代方案:MobileNetV2+GRU组合、Temporal Shift Module(TSM)和帧级池化。这些方案在保持较高准确率的同时,充分利用RKNPU的硬件加速能力,显著提升推理效率。文章还分享了从模型转换到部署优化的完整流程和实战经验。

weixin_28724319的博客 417

(c语言)数组是一种特殊的指针?

C语言学习时,学到数组与指针的联系时,我们讲到数组是一种特殊的指针,特殊在哪呢? 数组在定义时,如int a[10],即开辟了特定的内存空间来存放数组中的元素,数组起到一个容器的作用,可通过访问容器的地址给容器内的东西赋值或修改,容器本身的地址是不可修改的,即理解为int* const p=a。 但要注意,上式中的a(数组名)可作为数组a中的首元素地址使用,那么&a又表示何种意义?看以下代码 int a[10]; int* p=NUL...

咸鱼王志奇的博客 1032

2023西工大NOJ (C语言版) 完结!!!

代码均可AC,不含解析。

annesede的博客 8万+

数组名和指向数组的指针的不同

1.数组名是不能改的,可以看做 int *const p 而指向数组的指针是一个左值,即等号左边的值,可以被赋值修改,其本身就是一个变量。 2.sizeof(数组名)得到整个数组字节数sizeof(指向数组的指针)得到的是指针数据类型的字节数 ...

qq_56936051的博客 189

Python与CAD系列基础篇(十)图形复制、移动、删除

①通过pyautocad连接AutoCAD进行处理②通过ezdxf处理dxf格式文件。进行图形复制、移动、删除的方法。pyautocad方式。pyautocad方式。

weixin_43894929的博客 2209

15、人工智能社会学:关系视角下的机器相遇

本文探讨了将人工智能视为社会主体的可能性,提出了一种关系视角下的人工智能社会学。通过结合卢西亚娜·帕里西、艾伦·图灵和乔治·赫伯特·米德的理论,强调不确定性在人工智能运行中的核心地位,并分析了人工智能如何通过与社会环境的互动催生新奇性,从而拓展社会学的研究范畴。文章还讨论了人工智能对社会结构和社会互动的影响,以及其作为社会主体所带来的理论和实践意义,为未来人工智能社会学的发展提供了方向。

pea55的博客 72

指针和数组名的区别和联系

一、首先,数组名不是指针!!! 我做了如下程序供大家学习和参考: #include <stdio.h> int main() { int *p; int *q; int a[15]; q = a; printf("指针 p 的大小是:%d\n", sizeof(p)); printf("指针 q 的大小是:%d\n", sizeof(q)); printf("数组 a 的大小是:%d\n", sizeof(a)); printf("

qq_55648035的博客 2028

别再让 AI 瞎写 SAP 代码了!这套 Claude Code Skill 的验证机制才是关键

本文深入解析了专为SAP CAP开发设计的AI辅助工具sap-cap-capire的技术架构。该工具采用四层设计:协议层集成MCP和LSP实现实时模型访问与语法检查;智能层通过4个专业化Agent(数据建模、服务开发等)分工协作;验证层确保代码质量;知识层存储文档模板。这种工程化设计解决了通用AI在CAP开发中面临的上下文不足、专业性缺失和代码质量保证等核心问题,通过本地化服务和实时反馈机制显著提升了开发效率。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 880

C语言中数组名和指针的区别

1: 指针是一个变量,而数组名不是。数组名是数组的首地址,即它本身就是一个地址。 2:假设a是一个数组名,而p是一个指针,当你使用 a 和 &a 时,得到值是一样的,都是数组的起始地址。而使用 p 和 &p 时,得到的值是不一样的, p 表示指针 p 所指向的地址,而 &p 表示 p 这个变量的地址。再假设 p = a; 则 p 就表示数组a的起始地址,而&p是存储数组a的起始地址的那个地址。 这是因为编译器把a当成数组首地址,而&a当作数组第一个元素的地址,因此得到的值是一

lpfhjw的博客 5385

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C语言指针:数组名、二级指针

一维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式,数组传参本质上传递的是数组首元素的地址。 二级指针解引用一次得到的就是指向的一级指针,二级指针解引用两次得到的就是一级指针指向的对象。

m0_62183318的博客 1045

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

C语言——对数组名的理解

在C语言中,数组名可以被理解为指向数组首元素的指针。这意味着,当你使用数组名时,它会被自动转换为指向数组首元素的指针,即数组的第一个元素的地址。运行结果如下图所示:我们需要注意的是:arr和&arr是不同的运行结果如下图所示:通过运行结果我们可以发现:arr+1跳过的是一个整型的字节数&arr+1跳过的是一个数组的字节数。

ASHIDEH的博客 2119

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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

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

2302_81115588的博客 1554

数组名不是常量指针

这篇是一篇C语言劝退流教学文,看不懂的同学应该是劝退教学流的目标对象 (写完了才想起来注一下,本文提到的“数组”和“数组名”字样,指的是数组左值表达式(array lvalue expression)或数组声明(array declaration)所声明的变量) 首先,数组名不是常量指针,从两方面: 类型方面,数组的类型是type[size],和常量指针类型type* const不同 使用方面,...

qq_43026520的博客 1307

C语言指针进阶训练

对C语言指针的进一步学习,通过常见的进阶练习,能够帮助学者更加深刻的学习指针的实际操作与用法。

Hello_shuo的博客 2211

C++/C的数组名到底是什么?

先定义一个一维数组 int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 一、数组名是什么 数组名经常被隐式转换为指向数组首元素的指针常量: 数组名不是指针,但大多数使用到数组名的地方,编译器都会把数组名隐式转换成一个指向数组首元素的指针来处理。只有两种情况下例外: 第一种是对数组名使用sizeof运算符 sizeof(a) 这将会得到整个数组所占的内存...

qq_36570733的博客 5048

c语言 数组名本质为指针常量,以及数组名在哪个区存放,数组空间在哪开辟

在ubuntu环境下c语言中 数组名本质是常量指针,代表首元素地址。数组首元素地址和数组首地址有着相同的地址编号。

Zheng_Emperor的博客 2815

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

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

平凡的世界 3772

C语言 数组名不是首地址指针

今天上计算机系统课的时候老师讲到了C中的聚合类型的数据结构。在解释数组名的时候说“数组名是一个指针,指向该数组的第一个元素”,附上ppt(第二行): 我觉得这是不正确的,是一个常见的由“简化”产生的错误,数组名 != 指针。数组名是一个标识符,它标识出我们之前申请的一连串内存空间,而且这个空间内的元素类型是相同的——即数组名代表的是一个内存块及这个内存块中的元素类型 。只是在大...

a_18067的博客 542

C语言指针2(数组名,指针数组)

sizeof ( arr ) :这⾥的数组名表⽰的是整个数组,比如下面这个代码有10个元素每个元素是int类型,int类型是4个字节,10个元素就是40个字节。这⾥我们使⽤ &arr[0] 的⽅式拿到了数组第⼀个元素的地址,但是其实数组名本来就是地址,⽽且。下面这个代码我们可以看到地址是一样的说明&arr[0]和arr拿到的都是数组首元素的地址。因为传给函数的是数组首元素地址这个地址是int类型int是4个字节。⼀维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式。

2401_86723175的博客 1844

C语言指针数组、数组指针分析(数组名、&数组名(取地址数组名)、字符指针、函数指针等)

文章目录前言一、区分指针数组、数组指针二、区分数组名、&数组名三、字符指针四、函数指针总结 前言 本文将介绍指针数组、数组指针,了解二者的区别。学习数组名、&数组名(取地址数组名)的不同。掌握字符指针、函数指针等相关内容。 一、区分指针数组、数组指针 我们先来看一个例子: //定义如下两个变量 int *p1[10]; int (*p2)[10]; 如何区分p1、p2是指针数组还是数组指针? 在此之前,我们先了解二者对应的概念。 (1)指针数组: 简单来讲,指针数组就是一个存放指针的数

m0_53689542的博客 3406

45 C 语言指针与数组核心详解:数组名与指针的关系、指针遍历数组技巧

本文深入解析 C 语言指针基本操作,涵盖数组名与指针的关系(sizeof 行为、& 操作符行为等差异)、使用指针遍历数组的多种方法(如 *(arr+index) 、*(ptr+index)、ptr[index]、for/while 循环与指针结合等)。内容详实,示例丰富,适合 C 语言学习者掌握指针精髓。

大模型全栈工程师 · Thanks_ks 1913
上一篇: C语言-动态创建二维数组
下一篇: 栈 - 关于出栈序列,判断合法的出栈序列
syzdev
博客等级 码龄9年 852粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值