C++ primer 中文第四版 中的一个疑问

kameron 2011-05-29 09:44:52
下面是个代码段,关于指针和多维数组的p123页



int ia[3][4];
typedef int int_array[4];
int_array *ip = ia;

for(int_array *p=ia; p!=ia+3; ++p)
for(int *q=*p; q!=*p+4; ++q)
cout<<*q<<endl;


这段代码我有两个地方没有看懂:
1、

typedef int int_array[4];
int_array *ip = ia;

我没看懂上面的语句,主要是代码为啥不是这样的:

typedef int[4] int_array;
int_array *ip = ia;


2、

for(int_array *p=ia; p!=ia+3; ++p)
for(int *q=*p; q!=*p+4; ++q)
cout<<*q<<endl;

我认为内层for应该是这样的
 
for(int *q=p; q!=p+4; ++q)
...全文
126 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ChengNan_ 2011-05-29
  • 打赏
  • 举报
回复
第一个问题
是语法问题,你把typedef去掉,是不是就是一个变量声明?如果要typedef一个别名,你就先写个声 明,然后再把typedef加载前面,在声明中的变量名就是这个变量的类型的别名。
第二个问题

for(int_array *p=ia; p!=ia+3; ++p)
for(int *q=*p; q!=*p+4; ++q)
cout<<*q<<endl;

你要明白++p,++q,++(*p)到底移动了多少偏移。++p移动了4个int的,++q移动了1个int,而++(*p)实际就是和++q类似的了
  • 打赏
  • 举报
回复
typedef int[4] int_array; int_array *ip = ia;
和这个#define int_array int[4] 一样的效果
就是吧int换个包装成int[4]
qwer_boo 2011-05-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 qqianqq 的回复:]

C/C++ code

#include <iostream>
using namespace std;
int ia[3][4];
typedef int int_array[4];//人家就是这么定义的
//定义函数指针 typede void (*FuncPoint)();
//int_array *ip = ia;
void main(……
[/Quote]
+1
QQIANQQ 2011-05-29
  • 打赏
  • 举报
回复

#include <iostream>
using namespace std;
int ia[3][4];
typedef int int_array[4];//人家就是这么定义的
//定义函数指针 typede void (*FuncPoint)();
//int_array *ip = ia;
void main()
{
for(int_array *p=ia; p!=ia+3; ++p)
for(int *q=*p; q!=*p+4; ++q)//*p其实是一个4维的int数组,但是会被转化成指向首个元素的指针。
cout<<*q<<endl;
}
lucky-lucky 2011-05-29
  • 打赏
  • 举报
回复
在百度里直接输入typedef int int_array[4];
shaotine_wu 2011-05-29
  • 打赏
  • 举报
回复
*p指向每一行的第一个元素,p为二维指针
qq120848369 2011-05-29
  • 打赏
  • 举报
回复
指针数组的指针是二级指针,数组就是由首元素地址代表的,需要它的地址那就是地址的地址,即指向数组的指针.
ryfdizuo 2011-05-29
  • 打赏
  • 举报
回复
typedef 定义数组类型就是这么写的,typedef int Int4[4];
习惯就好了。
woshihuiyuanma 2011-05-29
  • 打赏
  • 举报
回复
哈哈,我也看了这本书,第一个问题也令我很迷惑
bluesky12312388 2011-05-29
  • 打赏
  • 举报
回复
1.规定就是这样的。typedef int[4] int_array;是错误的语法。

2. p 是指向一个数组,它是二维指针,内层for 当然是 int *q = *p;
pathuang68 2011-05-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 qqianqq 的回复:]


#include <iostream>
using namespace std;
int ia[3][4];
typedef int int_array[4];//人家就是这么定义的
//定义函数指针 typede void (*FuncPoint)();
//int_array *ip = ia;
void main()
{
for(int_array *p=ia; p!=ia+3; ++p)
for(int *q=*p; q!=*p+4; ++q)//*p其实是一个4维的int数组,但是会被转化成指向首个元素的指针。
cout<<*q<<endl;
}

有不同看法:
*p应该不能说是一个4维的int数组,说成是一个一维的int数组,且这个数组包含4个元素应该更合适一些。

在C中,有几个[]就可以说是几维的,而不是说[]中的数字。比如:
int a[10]...是1维数组,而不能说是10维数组;
int b[2][3]...是2维数组
int c[2][3][4]...是3维数组


#include <iostream>
using namespace std;
int ia[3][4];
typedef int int_array[4]; //人家就是这么定义的。
// 这样定义后的int_array就是一个一维的int素组,大小为4的新数据类型

//int_array *ip = ia;
// 上面这样,就定义了一个指向int_array数据类型的指针,因此ip相当于一个二维的int数组的起始地址
void main()
{
for(int_array *p=ia; p!=ia+3; ++p)
for(int *q=*p; q!=*p+4; ++q)//*p其实是一个4维的int数组,但是会被转化成指向首个元素的指针。
cout<<*q<<endl;
}
pingdan32 2011-05-29
  • 打赏
  • 举报
回复
第一个问题没什么好解释的,就是语法
第二:因为二维数组是数组的数组,要输出数组,第一次循环是遍历外层数组,这个数组的元素还是一个数组
所以第二个循环就要遍历每个元素数组的元素了,
for(int_array *p=ia; p!=ia+3; ++p)// 遍历外层数组,其元素还是一个数组,要注意的是p是一个指向第一个内层数组的指针
for(int *q=*p; q!=*p+4; ++q) // 遍历内层数组,因为p是个指向数组的指针,所以对其解引用*p得到的是一个数组
cout<<*q<<endl;

65,186

社区成员

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

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