永发信息网

C++数组指针的问题

答案:4  悬赏:30  手机版
解决时间 2021-05-14 22:38
  • 提问者网友:自食苦果
  • 2021-05-14 18:25

#include <iostream>
using namespace std;

void main()
{
int n[4][4] = {11, 22, 33, 44,
55, 66, 77, 88,
123, 234, 345, 456,
567, 678, 789, 890};
int (*p)[4];

p = n; // p = &n[0]

for (int i = 0; i <= 3; i++)
cout << *p[i] << endl;
cout << "-----------------------------------" << endl;
for (int i = 0; i<= 3; i++)
{
for (int j = 0; j<= 3; j++)
cout << "n[" << i << "][" << j << "] = " << *p[i] << endl;//这里有问题
*p++;

}

system("pause");
}

我想问一下, 用cout << "n[" << i << "][" << j << "] = " << p[i][j] << endl则可以正确输出数值, 但是p不是一个指针么?那么p就可以看成一个数组, 那么p[i][j]不就是三维数组了么, 怎么会输出正确的呢?

还有一个疑惑, 如果不用p[i][j], 而用递加p的内存地址, 然后取地址的数值, 这个方法应该怎么写呢?

最佳答案
  • 五星知识达人网友:话散在刀尖上
  • 2021-05-14 18:52

指针的本质是存储了存放数据的地址;而数组则是用固定的地址存放数据;


如:int a[10];


int *p;


p=a;//等价于p=&a[0],也就是把数组a的初始地址赋给了指针p,那么p[1]=a[1]


上面程序中p是一个指针数组,是包含四个指针的一维数组。


所以p[i]是一个指针,从而p[i][j]就是第i个指针中的第j个数据(注:i和j都是从0开始算起的)。


p[i][j]可以看作是一个二维数组,首先作为数组是一维(行),而一维指针又可看作一维(列)。


按内存取地址可以这样:


int m=0,n=0;


m=4*4;//二维数组的总个数


for(;n<m;n++)


cout<<*(p[0]+n);



全部回答
  • 1楼网友:鱼忧
  • 2021-05-14 21:34

先看这个简单的

#include <iostream>

using namespace std;

int main() { int a[3][3]={{1,2,3},{4,5,6},{7,8,9}}; int (*p)[3]=a; for(int i=0;i<3;i++) { for(int j=0;j<3;j++) //外层控制行访问,内层控制列访问 { cout<<*(*(p+i)+j)<<":"<<*(p+i)+j<<ends; } cout<<endl; } return 0; }

  • 2楼网友:平生事
  • 2021-05-14 20:59

&p[i][j]的结果是这样的

n[0][0] = 0012FF40 n[0][1] = 0012FF44 n[0][2] = 0012FF48 n[0][3] = 0012FF4C n[1][0] = 0012FF50 n[1][1] = 0012FF54 n[1][2] = 0012FF58 n[1][3] = 0012FF5C n[2][0] = 0012FF60 n[2][1] = 0012FF64 n[2][2] = 0012FF68 n[2][3] = 0012FF6C n[3][0] = 0012FF70 n[3][1] = 0012FF74 n[3][2] = 0012FF78 n[3][3] = 0012FF7C

  • 3楼网友:零点过十分
  • 2021-05-14 19:34

1。数组名== 指针,所以p[i][j] == n[i][j](你可以看内存地址,他们两一样的)

2。你直接调试了看么,看数组地址都可以看的,你想打出来直接取个地址符,我试试因该可以

#include <iostream> using namespace std;

void main() { ////////////////////////////// int n[4][4] = {11, 22, 33, 44, 55, 66, 77, 88, 123, 234, 345, 456, 567, 678, 789, 890}; /////////////////////////////// int (*p)[4];

p = n; // p = &n[0]

///////////////////////////////

for (int i = 0; i <= 3; i++) cout << *p[i] << endl; cout << "-----------------------------------" << endl;

//////////////////////////////

for (int i = 0; i<= 3; i++) { for (int j = 0; j<= 3; j++) //括号别贪方便省略!!!好的习惯是基础 { cout << "n[" << i << "][" << j << "] = " << &p[i][j] << endl;//这样就可以取地址了 } //*p++; //你这步很没必要,想干什么啊!!!!!

}

system("pause"); }

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯