C++ 二级指针和二维数组
2015-03-11 20:11
417 查看
首先很明确的一点是:二级指针不等于二维数组。
虽然可以把二维指针当做二维数组使用,但是它们的"寻址方式"是不一样的。看如下代码:
首先初始化 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 上面的值。
虽然可以把二维指针当做二维数组使用,但是它们的"寻址方式"是不一样的。看如下代码:
#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 上面的值。
相关文章推荐
- C/C++二维数组名和二级指针
- C++:二维数组和二级指针的传递问题
- C++指针和数组:二级指针和二维数组
- C/C++二维数组名和二级指针
- C/C++二维数组名和二级指针的联系与区别
- C/C++学习之C提高-----非空格的字符串长度、去掉字符串前后空格、字符串反转、键值对字符串、const练习、二级指针做输入/输出的特性、将字符串按逗号分开,并放入二维数组打印出来
- 二级指针与二维数组使用误区
- 二级指针和二维数组的转换
- 等级考试二级C++考点分析之数组、指针与引用
- C/C++中二级指针的理解
- 二维数组和二级指针的传递问题
- 二维数组与二级指针
- C++ 行指针访问(遍历)二维数组所有元素 .
- [转]二维数组和二级指针的传递问题
- 二级指针与二维数组的秘密【二者不等】
- 二维数组名就是二级指针,但是又不能像下面这样操作
- 二维数组传递给二级指针
- 二维数组名就是二级指针,但是又不能像下面这样操作
- 【C++】 动态二维数组 new 指向指针的指针
- 二维数组和二级指针