C++ 二级指针和二维数组

首先很明确的一点是:二级指针不等于二维数组。

虽然可以把二维指针当做二维数组使用,但是它们的"寻址方式"是不一样的。看如下代码:

#include<iostream>
int main()
{
	int **p;
	int cp[3][3];
	for (int i = 0; i < 3; i++){
		for (int j = 0; j < 3; j++){
			cp[i][j] = i * 3 + j;
		}
	}
	p = reinterpret_cast<int**>(cp);
	printf("%d\n", cp[0][2]);
        printf("%d\n", p[0][2]);
        
}

首先初始化 cp 为 0-8.

然后希望通过不同的防止输出cp的0行2列的值(应该为 2)

第一行 printf 输出 2,但是第二行会出错:0xC0000005: Access violation reading location 0x00000008.

这是因为二维数组的存储其实是按照一维数组的方式连续存储的。

对于数组 cp[0][2] 寻找的是第 0 行第二列的元素的值,也就相当于内存地址:cp + 0 * 3 + 2 上面存储的值。

然而如果cp 是二级指针,即上述代码中的p,则编译器对 p[0][2] 的解码是:首先把 p 当做是一个普通的指针,找到p[0] 的地址(p+0)后,再把 p[0] 里面存放的值 p1 = 0 当做是一个指针,然后在 p1 上进行下一次的寻址:p1[2] 对应的地址是:p1 + 2 .所以最后程序输出的是内存地址:p1 + 2 中存储的值,因为 p1 是一个指针,假设 sizeof p1 = 4,则有 p1+2 = 8(注意指针相加规则),因此 p[0][2] 读取的是地址 0x00000008 上面的值。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值