问一个关于数组的问题

HashCodeWithJava 2004-07-08 06:50:43
我想问一下这些之间的在内存存放的区别:
1.
int a[10][10];
2.
int *a[10];

3.
int **a;

谢谢!
...全文
186 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
expert2000 2004-07-09
  • 打赏
  • 举报
回复
这是c/c++的一个难点 ,没有十次八次的练习是搞不懂的。
oldjackyone 2004-07-09
  • 打赏
  • 举报
回复
我想不到

sizeof(b) == 10 * sizeof(int *)

会有什么不正确的.....

^_^
nkwesley 2004-07-09
  • 打赏
  • 举报
回复
书上都有的
  • 打赏
  • 举报
回复
peter9606(裴裴) ,请注意:你错了!
-------------------------
Leaveye(~枝)(完全了解系统,也要实际量测性能) 是对的!

1. int a[10][10];
sizeof(a) = 10 * 10 * sizeof(int)

2. int *a[10];
sizeof(a) = 10 * sizeof(int *)

3. int **a;
sizeof(a) = sizeof(int **)
-------------------------------


#include <iostream>
using namespace std;

void main(void)
{

int a[10][10];
if( sizeof(a) == 10 * 10 * sizeof(int) )
{
cout << "1\tOK!" << endl;
}

int *b[10];
if( sizeof(b) == 10 * sizeof(int *) )
{
cout << "2\tOK!" << endl;
}

int **c;
if( sizeof(c) == sizeof(int **) )
{
cout << "3\tOK!" << endl;
}
}
qybao 2004-07-08
  • 打赏
  • 举报
回复
最简单的就是
int a[3] = {1, 2, 3};
int b[4] = {1, 2, 3, 4};
int c[5] = {1, 2, 3, 4, 5};
//比较各种情况
int t1[3][3] = {{1,2,3}, {4,5,6}}; //这个数组是固定不变的
int *t2[2];
t2[0] = a;
t2[1] = b; //数组是不规则的,但数组只能是2行,列可变
int **t3;
t3 = new int*[3]; //数组行可变
t3[0] = new int[3];//列也可变
t3[1] = new int[4];
t3[2] = new int[5];
delete [] t3[0];
delete [] t3[1];
delete [] t3[2];
delete [] t3;

riitso 2004-07-08
  • 打赏
  • 举报
回复
int *a[10];
sizeof(a) = 10 * sizeof(int *)

对的
oldjackyone 2004-07-08
  • 打赏
  • 举报
回复
1.
int a[10][10] : 类似于表格的数组,表格里有行和列。
2.
int *a[10] : 指针数组,在a里面存贮10个指向int型变量的地址。

3.
int **a :指针的指针,跟 1 里面是有区别的: 这里 a 是一个指针,而 1 里 a 是一个二维数组,虽然在有些时候一样的用,但意义是不同的。

具体可看小弟分析的一个CSDN上网友提的问:

http://www.cnblogs.com/oldjacky/archive/2004/06/23.aspx
qybao 2004-07-08
  • 打赏
  • 举报
回复
2 int *a[10]; 指针数组,即每个数组元素的指向是可以改变的
举个例子
int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int *b[3];
b[0] = a[2]; //把a[2]的地址赋给b[0],即b[0]与a[2]指向相同的地址,也就是a[2][0]开始的地址
cout << "b[0][0] = " << b[0][0] << endl;
int d[3] = {1, 2, 3};
b[1] = d; //b[1]与d指向相同的地址,也就是b[0]开始的地址
cout << "b[1][0] = " << b[1][0] << endl;

3 int **a; 指向指针的指针,用法上与2差不多,但是这里a可以改变,而2里a是不能改变的,而且还可动态申请内存,变为不规则数组
举例
int t[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int *a[3] = {t[0], t[1], t[2]};
int *b[3] = {t[2], t[0], t[1]};
int **c;
c = a;
cout << "c = " << c << endl;
*c = a[1];
cout << "*c = " << *c << endl;
cout << "**c = " << **c << endl;
*c = b[1];
cout << "*c = " << *c << endl;
cout << "**c = " << **c << endl;
c = new int*[2];
c[0] = new int[2];
c[1] = new int[3];
c[0][0] = 1;
c[0][1] = 2;
c[1][0] = 4;
c[1][1] = 5;
c[1][2] = 6;
cout << "(*c)[1] = " << (*c)[1] << endl;
cout << "(*(c+1))[2] = " << (*(c+1))[2] << endl;
delete [] *c;
delete [] c;
robin97 2004-07-08
  • 打赏
  • 举报
回复
蹭分
peter9606 2004-07-08
  • 打赏
  • 举报
回复
int *a[10];
sizeof(a) = 10 * sizeof(int *)
错!
Leaveye 2004-07-08
  • 打赏
  • 举报
回复
这样说或许比较容易理解吧,也顺便检验一下自己的理解:

1. int a[10][10];
sizeof(a) = 10 * 10 * sizeof(int)

2. int *a[10];
sizeof(a) = 10 * sizeof(int *)

3. int **a;
sizeof(a) = sizeof(int **)

而各种指针(type *)的占用空间是相同的(原因是都只是存放地址)。


欢迎大侠指正补充
Dong 2004-07-08
  • 打赏
  • 举报
回复
楼上正确,谢谢你的提醒。
flyskydotnet 2004-07-08
  • 打赏
  • 举报
回复
int *a[10]应该是十个指针,a[0],a[1]....a[9]这十个都是指向int类型的指针
是一个指针数组
Dong 2004-07-08
  • 打赏
  • 举报
回复
int a[10][10];一个int类型的二维数组。存放在栈中,堆栈回收而被摧毁,
int *a[10];一个指向十个元素的int类型指针。a永远存在,但a的内容是不能保留的。
int **a;一个int类型指针的指针。a永远存在,而且内容可以保留

这道题真的不清楚,乱说的原因是为了别人指正我,让我可以觉住它!永远记住!!

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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