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

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

struct Hello
{
int a;
int b;
};


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


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

之后我怎么样用指针p去遍历这个二维数组?
...全文
508 19 打赏 收藏 转发到动态 举报
写回复
用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
第3章数据结构 3.1 结构体 实例079结构体类型的定义 实例080结构体变量的初始化 实例081如何使用嵌套结构 实例082将结构作为参数传递并返回 实例083共用体数据类型的定义 实例084共用体变量的初始化 实例085如何使用匿名共用体 实例086枚举类型的定义与使用 实例087用new动态创建结构体 实例088使用结构体标识操作员名称密码和级别 实例089创建包括12个月份的枚举类型 实例090带有函数的结构体 3.2 指针、地址与引用 实例091使用指针自增操作输出数组元素 实例092利用指针表达式操作遍历数组 实例093数组地址的表示方法 实例094指针数组的常用方法 实例095结构指针遍历结构数组 实例096指针作为函数的参数 实例097多维数组指针参数 实例098指针作为函数的返回值 实例099使用函数指针制作菜单管理器, 实例100使用指针实现数据交换, 实例101使用指针实现整数排序 实例102指向结构体变量的指针 实例103周指针实现逆序存放数组元素值 实例104输出二维数组的有关值 实例105输出二维数组任一行任一列值 实例106使用指针查找数列中的最大值和最小值 实例107用指针数组构造字符串数组 实例108将若干字符串按照字母顺序输出 实例109用指向函数的指针比较大小 实例110用指针函数实现求学生成绩 实例111使用指针指针输出字符串 实例112实现输入月份号输出该月份英文名 实例113使用指向指针指针对字符串排序 实例114分解字符串中的单词 3.3 数组 实例115向数组中赋值 实例116遍历数组 实例117求数组中元素的平均和 实例118数组的排序 实例119向数组中插入元素 实例120数组的删除操作 实例121数组冒泡排序法

64,647

社区成员

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

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