C++指针解读(4)-- 指针和数组(一维数组)

指针数组和数组指针的区别及其详解 对指针数组和数组指针的概念,相信很多程序员都会混淆。本文对其进行解析。 阅读详情

1、数组及数组的访问

1.1 数组的存储方式

在内存中,数组是一块连续的区域。数组的存储结构有如下特点:

(1)数组中的元素是同质的数据;

(2)索引从0开始;

(3)数组在内存中的存储单元是连续的;

(4)数据元素是按顺序连续存放的;

比如数组:

int a[6] = {1, 2, 3, 3, 5, 6};

它在内存中的存储结构是这样的:

1.2 数组指针

访问数组可以用下标法访问,比如a[0]访问数组的第一个元素;也可以通过指针访问。在C语言中,数组名代表数组首个元素的地址。比如a与&a[0]是等价的。所以,我们可以通过*a访问数组的第1个元素,*(a+1)访问数组的第2个元素,等。

在用数组名时,有几个地方不能把数组名当首地址看:

(1)sizeof(a)求数组空间长度时。这里的a代表整个数组。注意这个sizeof()不是函数,是关键字,用来计算数据在内存中使用的字节数,是在编译时确定的。比如,sizeof(a) = 6*4 = 24个字节。

(2)&a表示取数组a的地址,跟&a[0]是不同的。

a只是代表数组首元素的地址,是指向数组首元素的指针;和指向这个数组的指针不是一码事。在指针变量的定义时我们知道,指针变量包含数据类型和指针名字,所以指向数组的指针的数据类型是数组,其指针值+1就代表地址往下移动 “每个数组元素字节*数组长度” 的字节数。而a+1指针只是往后移动1个数组元素字节。

int a[6] = {1, 2, 3, 3, 5, 6};
int *pi = &a[0];
pi = &a[1]; //可以的
pi = &a; //会报错,因为pi是个int指针,可以指向数组里的元素,但不能指向整个数组

int (*pi2)[6]; //指向包含6个int元素的数组的指针
pi2 = &a; //这么写就可以了

(3)数组赋值的错误方式:

char str[10];
str = "abcd"; //报错

int arr_i[10];
arr_i = { 1, 2, 3 }; //报错

正确的赋值方式:

char str[10];
strcpy(str, "abc");

int arr_i[10];
for (int i = 0; i < 10; i++) {
    arr_i[i] = i;
}

或者在定义的时候初始化:

char str[10] = "abcd";
int arr_i[10] = { 1, 2, 3 };

2、数组指针相关运算

2.1 基础运算规则

假如定义了下面的数组和数组指针:

int a[6] = {1, 2, 3, 3, 5, 6};
int *p1 = &a[0];
int *p2 = &a[2];

(1)p1表示数组的首地址,则p1+i表示数组元素a[i]的地址。

(2)*p1表示数组元素a[0]的值,*(p1+i)表示数组元素a[i]的值。

(3)p2 - 1表示上一个数组元素,即a[1];p2 + 1表示下一个数组元素,即a[3]。

(4)p2 - p1是2个地址之差。

int a[6] = { 1, 2, 3, 3, 5, 6 };
int* p1 = &a[0];
int* p2 = &a[2];

printf("%p\n", p1);
printf("%p\n", p2);

int size1 = (char)p2 - (char)p1; //转成char后的差才是字节数
int size2 = p2 - p1;
printf("size1 = %d, size2 = %d\n", size1, size2);

输出结果如下:

这里需要注意,因为p2、p1是地址,所以减之前要转成char,这样减的差值才是地址字节数。

2.2 数组指针运算应注意的几个问题

int a[6] = {1, 2, 3, 3, 5, 6};
int *p = a;

(1)*p++

从右往左读。因此它等价于*(p++)。++在变量后表示先返回变量的值,然后再+1。比如i++表示先返回i的值,然后i+1。所以*(p++)先返回*p的值,然后指针再加1,指向p+1,即a[2]的位置。

(2)*(p++)和*(++p)

我们知道i++表示先返回i的值,然后i+1;++i表示先i+1,然后返回i的值。所以*(++p)先把指针往下移动1个数组元素,然后再返回这个元素的值,即返回a[2]的值。

(3)++(*p)

从右往左读。先得到*p的值,即a[1]的值。然后把a[1]的值加1。

3、用数组名作函数参数

数组名作函数参数可以写成下面的形式:

func(int arr[], int len)
//或
func(int* parr, int len)

上面2种方式是等价的,另外要记住数组作形状参时,必须同时传入数组的长度,否则可能会造成读取数组越界。这里有人可能会有疑问,不是可以在函数里用sizeof(arr)去获取数组的长度吗?不行的,因为形参int arr[]其实传过来的是实参数组的首地址。所以函数里的sizeof(arr)返回的是指针的长度,在32位系统中是4个字节,64位系统中是8个字节。

3.1

(1)数组表示法

void print(int arr[], int len) {
    for (int i = 0; i < len; i++) {
        //printf("arr[%d] = %d\n", i, *(arr + i)); //这2种打印方法都可以
        printf("arr[%d] = %d\n", i, arr[i]); 
    }
}

int main()
{
    int a[6] = { 1, 2, 3, 3, 5, 6 };
    print(a, 6);

    return 0;
}

(2)指针表示法

void print(int *arr, int len) {
    for (int i = 0; i < len; i++) {
        printf("arr[%d] = %d\n", i, *(arr + i));
        //printf("arr[%d] = %d\n", i, arr[i]); //这2种打印方法都可以
    }
}

C++ 二维数组,二维指针,数组指针深入研究(二维指针调用二维数组的方法) 关于用指针方式访问二维数组的问题 首先说明几种类型: int a[2][4] = { 1,2,3,4,5,6,7,8 };//二维数组 int **p; //二重指针跨度为sizeof(int *) int(*q)[4]; //该语句是定义一个指向数组的指针,指向含4个int元素的一维数组。跨度为4*sizeof(int); int * q2[4]; //定义了一个数组 里面存有int *... 阅读详情

相关推荐

指针的“分身术”:指针数组 vs. 数组指针,及字符串排序实战

本文解析了C/C++中数组指针和指针数组的核心区别:数组指针是指向数组的指针(如int(*p)[10]),而指针数组是存放指针的数组(如int* p[10])。重点通过字符串排序案例展示了指针数组的实用价值,通过交换指针而非字符串本身实现高效排序。代码示例演示了使用选择排序对字符串指针数组进行降序排列,仅需交换指针即可完成排序,避免了字符串数据的移动,显著提升了性能。

Web安全工具库 6713

c++ 指针与数组

c++ 指针与数组

淘气の小狼人的博客 1620

STC8单片机高精度EV1527解码实战:定时器捕获+状态机抗干扰方案

EV1527是一种广泛应用于433MHz无线遥控的曼彻斯特编码协议,其核心在于对脉宽时序(如同步头、逻辑0/1)的微秒级精确识别。传统外部中断+延时判别方式受MCU中断延迟、编译优化及环境噪声影响,极易导致误码;而基于硬件定时器输入捕获的解码方案,将时间测量交由硬件完成,显著提升时序鲁棒性与温度/电压适应性。该技术适用于STC8等无专用无线解码外设的8位单片机,在智能开关、晾衣架、车库门控等IoT终端中实现低至0.003%的稳定误码率。本文聚焦STC8H系列利用T1定时器下降沿捕获与有限状态机协同解码EV1

weixin_29188997的博客 181

【C++从0到1】58、C++中一维数组和指针

【代码】【C++从0到1】58、C++中一维数组和指针。

believer 237

稳健自适应波束形成学习(2):自适应计算对角加载量方法——基于广义线性组合的鲁棒Capon波束形成

对于快拍数相对阵元数较小时,样本协方差矩阵不能很好对协方差矩阵进行估计。常规的对角加载量需要根据经验值或不断手动调整进行测试,没有一个明确的准则和推导。该篇介绍一种自适应计算对角加载量的方法,且能适应快拍数相对阵元数较小时的情况。均匀线阵阵元数:18;载波频率30MHz;通信信号来波方向0°、来波估计偏差0.5°;干扰来波方向30°;通信信号信噪比10dB;干扰信号信噪比60dB。也即在干扰角度生成66dB的零陷,通信信号受到16dB的衰减。

a1uajug的博客 825

iOS WKWebView H5微信支付跳转

iOS WKWebView H5微信支付跳转 需求:iOS客户端实现嵌入H5进行微信支付跳转到微信客户端,支付完成后再跳转回我们的APP,解决WKWebView无法跳转回APP的BUG. 阅读前提: 了解WKWebView基本初始化及使用 了解如何利用URL Schemes进行应用间跳转 公司或个人已经在微信后台注册了一级域名 GitHub地址(附代码) :iOS WKWebView H5微信支付跳转 简书地址 :iOS WKWebView H5微信支付跳转 博客地址 :iOS WKWe...

ForeverMyheart的博客 2046

【C语言】指针与数组:指针数组、数组指针与函数指针全面解析

详细解释了C语言中数组指针 与 指针数组、函数指针 与 函数指针数组、指针与一维、二维数组的详解概念,理解、使用和实例分析。

卜及中的博客 1183

不止于使能:用汇川PLC功能块封装,实现伺服轴状态管理与安全逻辑

本文深入探讨了汇川PLC功能块封装在伺服轴控中的应用,详细介绍了如何通过高级封装技术实现伺服轴的状态管理与安全逻辑。文章涵盖了从基础使能到全生命周期监控的进化,多轴协同的实例化管理策略,以及安全逻辑的防御性编程技巧,为工业自动化领域的工程师提供了实用的解决方案和最佳实践。

weixin_28684825的博客 271

C++:指针访问数组元素

数组:一个连续的空间中存放了相同类型的数据元素。 利用指针访问数组中每个元素。 #include <iostream> using namespace std; int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; cout << "Firs Array is " << arr[0] << endl; int* p = arr;//arr是数组首地址; cout << "Firs

e.g.: 2728

硅光芯片边耦合器综述(一)

摘要:硅光子学在过去几十年间吸引了越来越多的关注,由于其具有诸多优点,如极低的成本、硅的高折射率带来的高集成密度,以及与现有半导体制造工艺的兼容性,被认为是未来日常应用中的一项充满前景的关键技术。在硅光子集成电路中,光互连是一个重要的问题,而在数据中心和光传输系统等应用场景中,光纤到芯片的光互连至关重要。光纤到芯片的光学耦合主要分为两大类:面外耦合(off-plane coupling)和面内耦合(in-plane coupling)。光栅耦合器属于前者,而边耦合器则属于面内耦合。本文主要关注硅光子集成电路

jhbfsoagoodgio的博客 5040

在 SAP ABAP 里可靠地对接 FTP 服务器:从连接、命令到传输与排错的完整实战

本文详细介绍了在SAP ABAP中实现FTP文件交换的完整技术方案。文章首先解析了FTP协议的双连接特性(控制连接与数据连接),强调保持控制连接的重要性。随后详细说明了ABAP中FTP操作的四步标准流程:建立连接(包含HTTP_SCRAMBLE加密)、执行命令、断开连接和关闭RFC通道。文章提供了实战案例代码,演示如何将FTP文件复制到应用服务器再读取进内表处理,特别指出后台作业与前台操作的关键差异。最后总结了常见错误排查要点,包括连接模型、路径设置和资源释放等问题。全文通过SAP标准函数模块的调用顺序、典

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

数组名既可作为指针也可作为变量名

数组名可以作为指向首个元素的指针,是因为C语言的设计使得数组名在大多数上下文中会被自动解释为指向其第一个元素的指针。这种设计的目的是为了方便数组的操作,特别是通过指针来访问数组元素。而数组名可以代表整个数组,主要是因为存在像sizeof操作符这样需要对整个数组进行操作的场景,以及在数组初始化、作为函数参数(从声明形式上看)等场景中,需要明确数组的整体概念。正是C语言的语法和语义设计使得数组名在不同场景下有这两种不同的表现。

m0_61968622的博客 1048

SkillClaw:让大模型 Agent skill在多用户生态中实现群体进化的框架

随着大模型应用步入深水区,基于 LLM 的智能体(Agent)正从单一的“沙盒玩具”转变为处理真实世界复杂任务的生产力工具。然而,现有的 Agent 系统通常面临一个致命瓶颈——部署即固化。为了解决这一问题,最近有一篇新论文**《SkillClaw: Let Skills Evolve Collectively with Agentic Evolver》**提出了一种多用户生态 Agent 群体进化框架。

kakaZhui的博客 263

C++ 语法之数组指针

比如定义了一个int b[2][3],可以看成是什么,可以看成是我们定义了2个一维数组a[3]。可以看到a[3]的地址,是在a[2]的基础上加了个四个字节,这就是数组的规则。可以看到内存的首地址是FAA8开始,注意这里的a和a[0]的地址是相等,因为它们都是代表数组的第一个地址。a+1的话,它就会在a的值加1, 指针变量+1的意思,是在原来的地址上,增加该类型的字节数。那么b[0]即b[0][0]的的首地址,这个跟前面一维数组同样的原理,a跟a[0]地址一样。它的跨度是一个a[3]的跨度 12字节。

d3582077的专栏 1204

【误码率仿真】基于matlab 小波变换OFDM误码率仿真

其中,与传统的 OFDM 相比,小波变换 OFDM 在进行调制和解调时,使用的是小波变换函数。需要注意的是,由于小波变换函数将频域信号转换为时域信号,因此与传统 OFDM 不同,小波变换 OFDM 中的信号需要在时域上添加循环前缀。与传统的 OFDM 不同,小波变换 OFDM 使用小波函数作为基函数,而非正弦函数作为基函数,因此可以在保持子载波正交性的同时,让子载波之间的带宽变得更加均匀。在频域进行信号加权,然后进行小波逆变换,得到时域信号。在接收端进行信号接收,去掉循环前缀并进行小波变换得到频域信号。

Fanjufei的博客 662

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C++ 数组、数组指针、指针数组、动态数组等详解

先了解一下数组的结构,然后接着了解动态数组的结构。 数组数组: (1)数组大小固定。 (2)数组是一种复合类型 (3)存放类型相同的对象的容器,需要通过所在位置访问这些对象。 (4)数组的元素应该为对象,因此不存在引用的数组 (5)维度:数组中元素的个数,必须大于0,编译的时候维度应该是已知的,也就是说,维度必须是一个常量表达式。 (6)不能将数组的内容拷贝给其他数组作为其初始值,也不

暖心~的博客 5276

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C++指针解读(5)-- 指针和数组(多维数组)

相比一维数组,二维数组的概念和相关运算要复杂得多。

705

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【C/C++】一文带你彻底玩转C/C++中的指针!(万字解读,非常详细!适合初学者或老手回顾)

万字详细解读指针个各项用法和细节。从指针入门到深入理解。

greatming666的博客 1万+

C++指针类型的意义及指针与数组的关系

C++任何类型的指针转换都不会改变指针的数值,即不改变指针指向的内存地址,但会改变系统对内存的解读方式,指针类型的意义在于指定解读内存的方式。下面举个例子: #include <iostream> using namespace std; int main() { unsigned char m[8] = { 0x00,0x11,0x22,0x33,0x44,0x55,0x6...

艾斯卡诺的博客 729

c++如何打印一维数组首地址_深度解读C/C++指针与数组

指针和数组是密切相关的。事实上,指针和数组在很多情况下是可以互换的。例如,一个指向数组开头的指针,可以通过使用指针的算术运算或数组索引来访问数组。今天我们就来聊一聊数组和指针千丝万缕的关系;一维数组与指针指针可以用来访问数组,也可以用来改变数组成员,这点与数组本身的下标运算符功能并无区别,请看下面程序演示:int arr[4] = {520,1314,521,3344};int* p = NULL...

weixin_39640767的博客 402

C++指针解读

一、概念:指针与引用 程序中的所有变量与函数都存放到内存中,C++提供了指针对它们在内存中的地址进行访问。指针的功能强大,操作灵活,还能提高程序的运行效率。相对地,对内存操作是一把双刃剑,如果处理不当,将会造成程序的崩溃。引用则是变量的别名,它们使用同一块地址。 整型变量i和j在内存中存储 1.指针的声明 声明指针的一般形式如下: 数据类型标识符 *指针变量名 ...

gangganggood的专栏 1559

理解C指针和数组名

一、理解一维数组 二、理解二维数组 三、关于指针的题目

长期更新自学笔记 708

C++总结1——指针和引用/数组的区别

1.指针和引有什么区别?(从反汇编角度回答) a.其实引用和指针本质上是一样的,他们的汇编指令都是两行。 int a = 10; int *p = &a; //lea eax,[a]                          将a的地址放在eax寄存器中 //mov dword ptr [p], eax     将eax寄存

wendy_keeping的博客 1062

c/c++ 一级指针,二级指针,指针数组,数组指针,函数指针,指针函数

前言 学习c/c++的时候最让我们头疼的就是指针,各种类型的指针,各种概念,让我们看看什么是指针 正文 指针和内存息息相关 先让我们看看内存 这段内存大家都很熟悉 都知道数组名就是这个数组的首地址那我们怎么解读这块内存 分两块看这个内存 前边是内存的编号 后边是这个编号里面存的值 什么是内存的编号? 内存是连续的 一个接着一个 所以我们为了方便找到他们 给他们起了名字 也就是这块内存的地址 所以指针里面就是存了这些内存的编号 换句话说 指针存储了这块内存的地址 也就是指向了这块..

weixin_45012273的博客 449

指针和数组试题解析(1)一维数组部分

指针与数组的试题解析!代码+解析:完美诠释!!

weixin_64308540的博客 434

C语言字符数组、指针总结

C语言字符数组、指针总结

qq_48017759的博客 5283
上一篇: C++指针解读(3)-- 指针变量作为函数参数
下一篇: C++指针解读(5)-- 指针和数组(多维数组)
老蔡编程
博客等级 码龄23年 48粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值