如何用数组指针遍历二维数组?

nextoyou 2012-12-05 11:19:19
大家好,我有一个二维数组定义如下:

struct Hello
{
int a;
int b;
};


Hello hello[3][3] = {/*进行初始化*/};


之后我定义了一个数组指针:
Hello (*p)[3];
p = hello;

之后我怎么样用指针p去遍历这个二维数组?
...全文
521 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohuh421 2012-12-06
  • 打赏
  • 举报
回复
引用 11 楼 sxldfang 的回复:
C/C++ code?1234567891011121314151617181920212223242526272829303132333435363738#include<iostream>#include<iomanip>using namespace std;struct Hello{ int a, b;}; void main(){ Hello hel……
你自己 的代码中就使用了两种方法访问了. for(int j = 0; j<3; j++) { (*(p+i))[j].a=i*3+j; (*(p+i))[j].b=i*3+j+1; } printf("( %u, %u ) ", p[i][j].a, p[i][j].b);
sxldfang 2012-12-06
  • 打赏
  • 举报
回复
Sorry,上面的运行结果粘贴错了,应该是下面的样子:

( 0, 1 )     ( 1, 2 )     ( 2, 3 )
( 3, 4 )     ( 4, 5 )     ( 5, 6 )
( 6, 7 )     ( 7, 8 )     ( 8, 9 )
请按任意键继续. . .
sxldfang 2012-12-06
  • 打赏
  • 举报
回复
#include<iostream>
#include<iomanip>
using namespace std;
struct Hello
{
	int a, b;
};

void main()
{
	Hello hello[3][3];
	Hello (*p)[3] = hello;
	for(int i = 0; i<3; i++)
	{
		for(int j = 0; j<3; j++)
		{ 
			(*(p+i))[j].a=i*3+j;
			(*(p+i))[j].b=i*3+j+1;
		} 
	}

	for(int i = 0; i<3; i++)
	{
		for(int j = 0; j<3; j++)
		{ 
			printf("( %u, %u )     ", p[i][j].a, p[i][j].b);
		} 
		printf("\n");
	}
}


运行结果:

( 0, 1 )     ( 3, 4 )     ( 6, 7 )
( 3, 4 )     ( 6, 7 )     ( 7, 8 )
( 6, 7 )     ( 7, 8 )     ( 8, 9 )
请按任意键继续. . .
赵4老师 2012-12-06
  • 打赏
  • 举报
回复
VC调试时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。) 想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单! 指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。” 这辈子不看内存地址和内存值;只画链表、指针示意图,画堆栈示意图,画各种示意图,甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗?本人深表怀疑! 这辈子不种麦不收麦不将麦粒拿去磨面;只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头,压面条,烤面包,……能从本质上理解面粉、理解面食吗?本人深表怀疑!! 提醒: “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。 (Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。) 想要从本质上理解C指针,必须学习C和汇编的对应关系。” 不是一回事! 不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实! 有人说一套做一套,你相信他说的还是相信他做的? 其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗? 不要写连自己也预测不了结果的代码! 电脑内存只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是很多数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、……
c_rrb 2012-12-06
  • 打赏
  • 举报
回复
*p把指向一维数组的指针转化为投向单个元素的指针即第0个数组的第0个元素的地址 (*p)+j; //这里把二维数组当成一维数组来看,j应小于9即最大为8 //即p[i][j]元素的地址应为:(*p)+i*3+j;3为一维数组的长度
sxldfang 2012-12-06
  • 打赏
  • 举报
回复
引用 16 楼 nextoyou 的回复:
C/C++ code?12 (*(p+i))[j].a=i*3+j; (*(p+i))[j].b=i*3+j+1; 这两句是什么意思?
因为有: Hello hello[3][3]; Hello (*p)[3] = hello; 所以: hello[i][j] 就相当于 p[i][j] p是指向“有3个元素的一维数组”的指针,要访问该一维数组下标是j(j从0开始)的元素,就是: (*p)[j] 当然,p+i就指向下第i个“一维数组”,要访问该一维数组下标是j(j从0开始)的元素,就是: (*(p+i))[j] 由于*(p+i)相当于p[i], (p是指针,i是整数) 所以 (*(p+i))[j] 也相当于 p[i][j]
nextoyou 2012-12-06
  • 打赏
  • 举报
回复
 (*(p+i))[j].a=i*3+j;
            (*(p+i))[j].b=i*3+j+1;
这两句是什么意思?
lizhaozhen107 2012-12-06
  • 打赏
  • 举报
回复
a数组名可以理解成一个常量指针。
swordtan 2012-12-06
  • 打赏
  • 举报
回复
p[i]和*(p+i)是等价的
c_rrb 2012-12-05
  • 打赏
  • 举报
回复
最好给出完整的代码,感觉错不在此
c_rrb 2012-12-05
  • 打赏
  • 举报
回复
引用 3 楼 c_rrb 的回复:
*(p+i+j).a //将二维看成一维即有三个一维数组 //p+j+j:第i行第j列元素的地址
这个确实不对,对不起了 *(p[i]+j)=p[i][j]
nextoyou 2012-12-05
  • 打赏
  • 举报
回复
*(p+i+j)也用了,但是也有错误: error: request for member 'a' in '(p + ((((unsigned int)i) + ((unsigned int)j)) * 12u))', which is of non-class type
goodwithcode 2012-12-05
  • 打赏
  • 举报
回复
数组和指针,貌似差不多少
nextoyou 2012-12-05
  • 打赏
  • 举报
回复
我用了p[i][j].a,但是有以下错误: error: no match for 'operator[]' in '*(p + ((unsigned int)(((unsigned int)i) * 12u)))[j]'
hushoubo 2012-12-05
  • 打赏
  • 举报
回复
楼上正解...
breakfisher 2012-12-05
  • 打赏
  • 举报
回复
直接用p[i][j]就可以, p是一个数组指针 你可以用p[i][j].a, p[i][j].b
c_rrb 2012-12-05
  • 打赏
  • 举报
回复
*(p+i+j).a //将二维看成一维即有三个一维数组 //p+j+j:第i行第j列元素的地址
nextoyou 2012-12-05
  • 打赏
  • 举报
回复
什么意思?能举个例子吗? 我现在写的是
for(int i = 0; i<3; i++)
{
   for(int j = 0; j<3; j++)
   { 
       printf("value is %u\n", (*p+i)[j].a);
       printf("value is %u\n", (*p+i)[j].b);
   } 
}
c_rrb 2012-12-05
  • 打赏
  • 举报
回复
p+i+j

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧