指针数组和数组指针

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

本文转载自http://c.biancheng.net/cpp/html/476.html,但有修改,如有需要,请参考原文

指针数组和数组指针

一、指针数组和数组指针的内存布局

**指针数组:**首先它是一个数组,数组的元素都是指针,数组占多少字节由数组本身决定。它是“存储指针的数组”的简称。
**数组指针:**首先他是一个指针,它指向一个数组。在32位系统下永远是站4个字节,至于它指向的数组占多少字节,不知道。它是指向数组的指针的简称.

指针数组:
int *p1[10]
数组指针:
int (*p2)[10]

“[]”的优先级比“*”要高。p1 先与“[]”结合,构成一个数组的定义,数组名为p1,int 修饰的是数组的内容,即数组的每个元素。那现在我们清楚,这是一个数组,其包含10 个指向int 类型数据的指针,即指针数组。至于p2 就更好理解了,在这里“()”的优先级比“[]”高,“”号和p2 构成一个指针的定义,指针变量名为p2,int 修饰的是数组的内容,即数组的每个元素。数组在这里并没有名字,是个匿名数组。那现在我们清楚p2 是一个指针,它指向一个包含10 个int 类型数据的数组,即数组指针。我们可以借助下面的图加深理解:
在这里插入图片描述

二、int (*)[10] p2-----也许应该这么定义数组指针

这里有个有意思的话题值得探讨一下:平时我们定义指针不都是在数据类型后面加上指针变量名么?这个指针p2 的定义怎么不是按照这个语法来定义的呢?也许我们应该这样来定义p2:

   int (*)[10] p2;

int(*)[10] 是指针类型,p2 是指针变量。这样看起来的确不错,不过就是样子有些别扭。其实数组指针的原型确实就是这样子的,只不过为了方便与好看把指针变量p2 前移了而已。你私下完全可以这么理解这点。虽然编译器不这么想。

三、再论a 和&a 之间的区别
既然这样,那问题就来了。前面我们讲过a 和&a 之间的区别,现在再来看看下面的代码:

int main()
{
   char a[5]={'A','B','C','D'};
   char (*p3)[5] = &a;
   char (*p4)[5] = a;//这种写法是错误的,因为=左边是指向的一个数组,而右边却是数组a的首元素的地址,虽然值相同,但是意义却不相同
   return 0;
}

上面对p3 和p4 的使用,哪个正确呢?p3+1 的值会是什么?p4+1 的值又会是什么?毫无疑问,p3 和p4 都是数组指针,指向的是整个数组。&a 是整个数组的首地址,a是数组首元素的首地址,其值相同但意义不同。如何理解这个不一样呢?我们可以这样考虑,写&a的时候,编译器知道我要传的是一个数组,而写a的时候编译器仅仅会把数组的首元素的地址传进去,导致传的数据不足数组指针的指向数组的长度5。在C 语言里,赋值符号“=”号两边的数据类型必须是相同的,如果不同需要显示或隐式的类型转换。p3 这个定义的“=”号两边的数据类型完全一致,而p4 这个定义的“=”号两边的数据类型就不一致了。左边的类型是指向整个数组的指针,右边的数据类型是指向单个字符的指针。这个时候如果p3+1偏移的就是整个一维数组的长度即5个char的长度。

四、如果变成二维数组呢?

#include<iosteam.h>
void main()
{
    int n[][3] = {10,20,30,40,50,60};
    int (*p)[3];
    p=n;
    cout<<p[0][0]<<","<<*(p[0]+1)<<","<<(*p)[2]<<endl;
    //10 20 30
}

这个时候p=n是正确的,要理解这个概念就要明白一维数组和二维数组的名字的含义。

int arr1[10];
int arr2[3][10];

一维数组名的含义:一维数组名arr1代表的是这个一维数组首元素的首地址,如果要表示整个一维数组的话可以&arr1来表示。
二维数组名的含义:二维数组arr2可以看成是多个一维数组名组成的,所以二维数组可以看成是一维数组的一维数组,那么二维数组名代表的是其中第一个一维数组。

在上述的代码中,p=n代表的是指针p指向二维数组中的第一行,而这个时候p[0]可以看做是p走0个步长,即还是二维数组中的第一行,p[0][0]则是这个行中的第一个元素,即为10,*(p[0]+1),即还是在这一行中,步长为1代表这一行内步长加1,即p[0][1],(*p)和p[0]的意义相同(例如一维数组int a[10],*a和a[0]的取值是一样的),所以(*p)[2]表示的是这一行中第二个元素,即为30.

H3C交换机Console口连接全攻略:从接线到PuTTY配置(附常见问题排查) 本文详细介绍了H3C交换机Console口的连接与配置方法,包括硬件线缆选择、驱动安装、PuTTY参数设置及常见问题排查。特别针对Console转USB线缆的兼容性和驱动安装难点提供实用建议,帮助网络工程师快速掌握串联调试技巧,解决连接中的黑屏、乱码等典型问题。 阅读详情

相关推荐

Research Proposal:自动驾驶 行人运动预测

Research Proposal about Pedestrian/Cyclist Motion Prediction for Self-Driving Vehicles   If I can be provided with the opportunity to conduct PhD research in pedestrian/cyclist motion prediction for...

Poetry Wanderer的博客 3087

常量指针、指针常量,指针数组、数组指针,函数指针、指针函数

必须有返回值,返回指针。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 960

android广告SDK原理详解(附源码)

广大的开发者吃糠咽菜开发了一两款APP,获取了一些流量后自然就会想到流量变现,一般情况下大家会选择到百度联盟或者Google Admob这些广告服务提供商注册开发者账号,在自己的APP里面加上几行广告位代码,集成他们的广告SDK包。然后谋事在人,成事在天,只有每天看报表查查收益。   也有一些开发者为了能够提高自己的变现水平,同时接入了好几家的sdk,哪家出的收益高一点我就出哪家的广告,但是这

rmcgogo的博客 1万+

C语言—指针数组与数组指针

前言: 看到标题的小伙伴可能会有点疑惑,什么是指针数组,数组指针??傻傻分不清楚,不怕,听我慢慢道来。 正文: 要想弄清楚这两个概念,我们不妨举几个例子: 1、数组: int arr[5] = {1,2,3,4,5}; 这就是最简单的数组,数组中每个元素都是int类型,下面的图片帮助大家很容易理解。 数组可以将相同类型的数据整合到一起,你可以通过下标的方式或者指针的方式来访问,在这里不多赘述。 ...

weixin_44580000的博客 1万+

银河麒麟桌面操作系统V10(SP1)ssh服务安装与配置

在国产化的大背景下,各种国产操作系统逐步进入运维人员的视野,ssh作为linux远程连接工具,是运维人员必需的工具之一。本文主要介绍在银河麒麟桌面操作系统V10(SP1)上安装和配置ssh服务。

zhengshaolin128的博客 7806

51单片机STC8G1K08驱动ws2812记录

使用51单片机控制17个2812灯,这里选择STC8芯片,最大频率可以达到35M,参考网上的各种文章案例,使用定时器做的时候实测做不到规格书要求的245-345ns,STC8G1K08不带PWM,所以只能使用nop来做,好在单片机在这里只有做编程灯的功能,省略测试过程,下面是程序,使用的是24MHz内部晶振 //设置一个灯珠 void SendOnePix(unsigned char *ptr) { unsigned char i,j; unsigned char temp; fo...

的博客 7320

指针进阶之数组指针和指针数组

指针进阶之数组指针和指针数组,超详细,不会来看

人生得意须尽欢 7950

代谢组数据分析(十九):随机森林构建代谢组预后模型

建立胃癌(GC)预后模型时,从队列3中的181名患者中,使用右删失结果数据进行了随机分层抽样,分为训练数据集(n = 121)和测试数据集(n = 60)。训练了一个包含1000棵树的随机生存森林(RSF)模型,根据它们基于排列的特征重要性来选择突出的特征。通过再次训练随机生存模型,并选取28种代谢物,建立了显示出色预测能力(AUROC = 0.832,95% CI:0.697-0.951)的最佳模型,用于预测测试数据集中GC患者的生存结果。

专注生信领域 1713

指针数组和数组指针(非常易懂)

指针数组 指针与一维数组 当定义一个一维数组时,系统会在内存中为改数组分配一个储存空间,其数组的变量名就是数组的首地址。若定义一个指针变量,并将数组的首地址赋值给指针变量,则我们说该指针指向了这个一维数组。 例如: int *p,a[10]; p=a; //数组的变量名a就是数组的首地址 另一种赋值方式也可写为: int *p,a[10]; p=&a[0]; //a[0]的地址也是数组的首地址 ...

itszok的博客 10万+

【Unity 实用工具篇】| Unity中 实现背景模糊效果,简单易用

背景模糊 是一个很实用的功能,它可以帮助游戏在视觉上有更好的专注力和表现力。 实现模糊的种类和方式有很多种,大家自行选择适合自己的就可以了。 下面一起来看下本文实现背景模糊的效果和使用方式吧!

努力前行,总会成为自己心中的那道光 4万+

20、七鳃鳗繁殖与早期生活史:从水质到养殖的全面解析

本文全面解析了七鳃鳗的繁殖与早期生活史,重点探讨了水质对幼体生存的影响、养殖密度与生长关系、变态过程的时间与大小特征,以及人工繁殖在濒危物种恢复和入侵物种控制中的应用。同时,文章分析了大规模养殖面临的挖掘基质需求、空间限制、清洁管理、疾病防控及微生物环境等挑战,并强调实验室养殖对科学研究和种群管理的重要意义。随着技术进步,未来有望扩展更多物种的繁殖研究,揭示七鳃鳗生物学的进化奥秘,实现资源的可持续利用。

l6m7n8的博客 116

指针数组和数组指针的区别和用处

“数组指针”和“指针数组”,其本质只要看最后的后缀 数组指针:是一个指针,指向数组的指针。 指针数组:是一个数组,装着指针的数组。

m0_74234485的博客 6667

基于物联网设计的蜂箱智能监测系统设计

为解决传统养蜂业依赖人工、管理效率低下、干扰蜂群等问题,本项目设计并实现了一套基于物联网(IoT)的蜂箱智能监测系统。

683

C语言数组之指针数组和数组指针

指针数组指针数组指针数组

weixin_34481217的博客 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

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

猫猫的小茶馆 5831

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

数组指针和指针数组

1、数组指针(指向数组的指针) (1)数组在内存中的表示 创建一个数组就是在内存里面开辟一块连续的空间,比如int a[4];就是在内存里面开辟了一个大小为4*sizeof(int)字节的内存空间。二维数组是特殊的一维数组。 先来看一段代码: void main() { int a[2][2]={1,2,3,4};//这是一个2*2的二维数组 int (*p)[2];//数

Touch_2011的专栏 5万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

数组指针和指针数组的区别

数组指针(也称行指针)定义 int (*p)[n];()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。 如要将二维数组赋给一指针,应这样赋值:int a[3][4];int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。 p=a;        //将该二维数组...

weixin_34189116的博客 4990

函数指针和指针函数以及数组指针和指针数组区别

函数指针(指向函数的指针) 与数据项类似,函数也有自己的地址。函数的地址是存储其机器代码的内存的开始地址。例如,可以编写将另一个函数的地址作为参数的函数,这样第一个函数将能够找到第二个函数,并运行它。与直接调用另一个函数相比,这种方法显得很笨重,但它允许在不同的时间传递不同函数的地址,这意味着可以在不同的时间使用不同的函数。 函数指针的用法需要以下三个步骤: 获取函数的地址 声明一个函数指...

一丁的博客 2987

对于数组指针和指针数组的理解及其应用

在之前的学习中,我们已经简单了解过了数组指针和指针数组(数组指针,指针数组,二级指针)我们知道指针数组其实就一个用来存放指针的数组.这里先做一个指针数组简单的回顾. int* arr[10]; //这是一个存放整型指针的数组 char* arr[10]; //存放字符型指针的数组 char** arr[5]; //存放二级字符型指针的数组 而容易与之混淆的就是数组指针. 数组指针其实就是指针,这个...

persistence_Y的博客 3787

指针数组 和 数组指针(指向数组的指针)

指针数组的本质是==数组==,其**元素都是指针**。这种数据结构常用于管理多个字符串或多个内存地址。以下是两个示例,展示了指针数组的使用方法。 数组指针的本质是==指针==。它指向数组的首地址,可以通过计算来指向其他的元素(计算方式类似于数组),因此可以认为它是指向数组中元素地址的指针,因为指向的是地址,所以==在取值操作时时要使用两次取值操作符`“*”`==*(这里不理解的可以看看文末“ 四、数组指针和数组元素的关系”的代码)*。

qq_74871667的博客 3509

C++的指针数组、数组指针和指针数组指针

类型例子本质常见用途指针数组数组(元素是指针)存多个字符串数组指针指针(指向数组)处理二维数组指针数组指针指针(指向指针数组)动态修改指针数组。

qq_44815135的博客 690

理解 一级指针 二级指针 指针和数组 指针数组

理解 一级指针 二级指针 指针和数组 指针数组 一级指针 指针是编程语言中的一个对象,它的值直接指向存在电脑存储器另一个地方的值, 由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。 因此,将地址形象化的称为“指针”,意思是通过它能找到以它为地址的的内存单元 指针是变量,用来存放地址的变量 int main() { int a = 10; int* p = &a; ...

PNUHC的博客 428
上一篇: 静态变量、全局变量、const常量
下一篇: c语言分区内存分区的方式
浮生勿语
博客等级 码龄10年 27粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值