C++ 指针与数组

本文详细解析了数组指针与指针数组的区别。数组指针如int(*p)[n],用于指向一维数组,p++会跨过n个元素;而指针数组如int*p[n],是一个包含n个指针的数组,p++仅移动一个元素。在赋值时,应注意指针类型与数组类型匹配,如将二维数组赋值给指针数组,需逐个元素赋值。
摘要由CSDN通过智能技术生成

数组指针

定义 int (*p)[n];

    由优先级关系,圆括号 () 与方括号 [] 优先级相同,从左至右阅读,则圆括号 () 优先级更高,首先说明了 p 是一个指针。然后得出该指针指向一个一维数组。

    数组长度为 n,则指针总步长为 n。倘若出现二维数组,则 p+1 (p++) 时,要跨过 n 个整型数据的长度。

    如要将一维数组赋给一指针,应这样赋值:

int a[4];
int *p;     //该语句是定义一个数组指针,指向含4个元素的一维数组。
p=a;        //将该一维数组的首地址赋给p,也就是a[0]

    如要将二维数组赋给一指针,应这样赋值:

int a[3][4];
int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。
p=a;        //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
p++;       //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]

注意 ① 数组名是该数组第一个元素的地址,语句“p = a”,左为指针变量(值为地址),右为数组名(第一个元素的地址),故“地址 = 地址”,语句成立。

② 二维数组的指针相较于一维数组要打括号,是因为二维数组本身可看作若干个一维数组为元素的一维数组。指针指向的地址类型要和二维数组内含的元素地址类型相同(即二维数组元素为长度是4的一维数组时,一个指针指向4个内存空间的地址,所以该指针要声明时包含内存空间长度【即步长】)((((其实我也不是特别懂,希望有人能指正))))

指针数组

定义 int *p[n];

   由优先级关系,方括号 [] 优先级在一级,先与 p 结合成为一个数组,再由 int* 说明这是一个整型指针数组,它有 n 个指针类型的数组元素。

    如此定义的情况下,当执行 p+1 (p++) 时,只向前移动 1 个步长,指向下一个数组元素。

注意 不可使用 p = a 的赋值方式,p[n] 作为指针数组是一个含有 n 个指针的数组,本质上为指针,应该指向一个变量的地址。这样的赋值方式出现了“地址 = 值”的错误。

正确写法 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。

如要将二维数组赋给一指针数组,应这样赋值:

int *p[3];
int a[3][4];
p++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针
for(i=0;i<3;i++)
  p[i]=a[i]

    这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2]
所以要分别赋值。

部分来源:数组指针和指针数组的区别 - jack_Meng - 博客园 (cnblogs.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值