二重指针、二维数组及二者如何进行赋值

如果已经定义了一个指针类型,我们再定义一个指针,用于指向已经定义的指针变量,后面定义的指针变量就是一个指向指针的指针变量,简称指向指针的指针,这样的指针也称二重()指针

一、一般情况的例子:

#include <iostream>

using namespace std;

int main(){
    int **p;
    int c = 2;
    int *b = &c;
    p = &b;
    cout << p << "\n" <<endl;
}

注意,因为p是个指针,所以必须p = &b,而不能p=b。

深入解释:(来自:指针数组和多重指针_JunkChen-CSDN博客)

char **p

p 前面有两个 * 号。* 运算符的结合性是从右到左的。因此 **p 相当于 *(*p) , *p 是指针变量的定义形式。可以分为两部分看: char * 和 (*p) ,后面的 (*p) 表示 p 是指针变量,前面的 char * 表示 p 是指向 char * 型的数据,即,p中存储的是char *型数据的地址,其中char *表示char类型数据的指针,所以p存储的是char *型指针的地址,所以前面p=&b而不是p=b。也就是说, p 指向一个字符型指针变量(这个字符型指针变量指向一个字符型数据)。如果引用 *p , 就得到 p 所指向的字符指针变量的值。
 

二、与一维数组结合的情况

int m[3] = {1, 2, 3};
int *d = m;
int **p;
p = &d;

m是一维数组的首元素地址,也就是指针值,所以可以直接赋值给d。

三、与二维数组结合的情况

3.1 有如下定义:

int a[3][4]={{10,20,30,40,},{50,60,70,80},{90,91,92,93}};
则数组a有3个元素,分别为a[0]、a[1]、a[2]。而每个元素都是一个一维数组,各包含4个元素,如a[1]的4个元素是a[1][0]、a[1][1]、a[1]2]、a[1][3]。
若有:
int *p=a[0];
则数组a的元素a[1][2]对应的指针为:p+1*4+2
元素a[1][2]也就可以表示为:*( p+1*4+2)
用下标表示法,a[1][2]表示为:p[1*4+2]

3.2 特别说明:

对上述二维数组a,虽然a[0]、a都是数组首地址,但二者指向的对象不同,a[0]是一维数组的名字,它指向的是a[0]数组的首元素(a[0][0])的地址,对其进行“*”运算,得到的是一个数组元素值,即a[0]数组首元素值,因此,*a[0]与a[0][0]是同一个值;而a是一个二维数组的名字,它的每一个元素都是一个行数组,因此,它的指针移动单位是“行”,所以a+i指向的是第i个行数组,即指向a[i]。对a进行“*”运算,得到的是一维数组a[0]的首地址,即*a与a[0]是同一个值。
(1)当用int *p;定义指针p时,p的指向是一个int型数据的地址,因此,用a[0]对p赋值是正确的,而用a对p赋值是错误的。
(2)当用int **p定义指针p时,p的指向是一个int *型的地址,但是a表示的是一个一维数组(a[0])的地址,a[0]表示的是一个数值(a[0][0])的地址,都不是int *型(int 型数值的地址的地址)的地址,所以不能用a或者a[0]对p进行赋值。
但是可以通过下面的方法赋值:

int **p;
int a[3][4]={{10,20,30,40,},{50,60,70,80},{90,91,92,93}};
int *e;
e = a[0];
​​​​​​​p = &e;

3.3 错误的情况

因为不能直接对地址取地址,所以不能使用下面的方法直接赋值:

int **p;
int a[3][4]={{10,20,30,40,},{50,60,70,80},{90,91,92,93}};
//int *e;
//e = a[0];
​​​​​​​p = &a[0];

即必须经过中间变量e才行,因为会给变量e分配存储空间。


3.4 图解如下: 

四、总结

结合一、二、3.2、3.3中的例子以及3.4的图解

 就可以总结出来一个规律:二重指针变量必须指向一重指针变量的地址,任何其他的地址都不行。必须使用一重指针变量才能给二重指针变量赋值

五、参考:

指针数组和多重指针_JunkChen-CSDN博客
C/C++——二维数组与指针、指针数组、数组指针(行指针)、二级指针的用法 - 怪猫佐良 - 博客园

之所以把这篇blog放出来,就是希望大家指点一下,看看我这个总结是不是正确的。

  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值