int (*iarr)[10]和int *(iarr2[10])的区别

abcdabcd987 2011-06-24 08:28:47
小弟刚学C++,对指针有点疑惑。写了个程序,发现int (*iarr)[10]和int *(iarr2[10])的意义是不同的,前辈们能不能解答一下这两者的区别?
另外,再问一个问题,一个类类型的变量,比如说一个string str,sizeof str怎么才4呢,能否顺便解答一下,谢谢!

#include <iostream>
#include <string>
using namespace std;
#define ARRAY(TYPE, NAME, LEFT, RIGHT) TYPE __myarray_##NAME[(RIGHT-LEFT)+1]; TYPE *NAME = NAME - LEFT;
int main()
{
int l, r;
cin >> l >> r;
ARRAY(unsigned long long, test, l, r);
for (int i = l; i <= r; ++i)
cout << "&test[" << i << "] = " << &test[i] << endl;
cout << "sizeof test :" << sizeof test << endl;
cout << "sizeof __myarray_test :" << sizeof __myarray_test << endl;

string str('a', 10000);
cout << "sizeof str :" << sizeof str << endl;
cout << "sizeof &str :" << sizeof &str << endl;

int (*iarr)[10];
cout << "sizeof iarr :" << sizeof iarr << endl;
cout << "sizeof *iarr :" << sizeof *iarr << endl;

int *(iarr2[10]);
cout << "sizeof iarr2 :" << sizeof iarr2 << endl;
cout << "sizeof *iarr2 :" << sizeof *iarr2 << endl;


cout << endl;
return 0;
}

输出:
&test[1]  =  0x400983
&test[2] = 0x40098b
&test[3] = 0x400993
&test[4] = 0x40099b
&test[5] = 0x4009a3
&test[6] = 0x4009ab
&test[7] = 0x4009b3
&test[8] = 0x4009bb
&test[9] = 0x4009c3
&test[10] = 0x4009cb
sizeof test :8
sizeof __myarray_test :80
sizeof str :8
sizeof &str :8
sizeof iarr :8
sizeof *iarr :40
sizeof iarr2 :80
sizeof *iarr2 :8
...全文
164 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2011-06-24
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!
luciferisnotsatan 2011-06-24
  • 打赏
  • 举报
回复
sizeof iarr :8 一个指针,8字节
sizeof *iarr :40 解引用后,一个int[10]数组,40字节
sizeof iarr2 :80 10个int指针的数组,80字节
sizeof *iarr2 :8 解引用后,就是一个指针,8字节。
至善者善之敌 2011-06-24
  • 打赏
  • 举报
回复
int (*iarr)[10]//数组指针 定义一个包含十个整形数的数组指针
和int *(iarr2[10])=int * iarr2[10] //指针数组 iarr2里存储10个INT指针
abcdabcd987 2011-06-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 du130456 的回复:]

int (*iarr)[10],iarr是个指针,指向一个有十个元素的数组。
int *(iarr2[10]),iarrr2是个数组,数组元素是指针
[/Quote]
[Quote=引用 4 楼 luciferisnotsatan 的回复:]

int (*iarr)[10] 数组指针,iarr是个指针,指向的元素类型是 int[10] 数组

int *(iarr2[10]) 指针数组,iarr是一个含有10个int指针的数组
[/Quote]
受教了!




[Quote=引用 5 楼 luciferisnotsatan 的回复:]

从结果看,lz是64位系统?
[/Quote]
是的
$g++ -v
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/lto-wrapper
Target: x86_64-linux-gnu
Configured with:.......................
gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4)
luciferisnotsatan 2011-06-24
  • 打赏
  • 举报
回复
从结果看,lz是64位系统?
luciferisnotsatan 2011-06-24
  • 打赏
  • 举报
回复
int (*iarr)[10] 数组指针,iarr是个指针,指向的元素类型是 int[10] 数组

int *(iarr2[10]) 指针数组,iarr是一个含有10个int指针的数组
dukong123 2011-06-24
  • 打赏
  • 举报
回复
int (*iarr)[10],iarr是个指针,指向一个有十个元素的数组。
int *(iarr2[10]),iarrr2是个数组,数组元素是指针
abcdabcd987 2011-06-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bdmh 的回复:]

int (*iarr)[10],这个是指针数组,iarr包含10个指针的数组
*iarr 这是对iarr指针的解引用,是iarr地址存储的值
[/Quote]
iarr包含10个指针的数组,这句话的意思是“iarr是一个数组,里面有10个指针”吗?

可是sizeof 数组,不应该返回整个数组的长度吗?
那sizeof arr应该返回40,而sizeof *arr返回4才对……
麻烦前辈再给我讲讲
bdmh 2011-06-24
  • 打赏
  • 举报
回复
int (*iarr)[10],这个是指针数组,iarr包含10个指针的数组
*iarr 这是对iarr指针的解引用,是iarr地址存储的值

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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