数组和指针的转换

Initiala 2009-12-02 03:28:11
比如定义了这样的一个数组:int a[m][n];那么在编译的时候表达式中的a是指怎么被转换成一个int **类型的指针的?要详细点的过程~~
...全文
791 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
ernst20020530 2009-12-04
  • 打赏
  • 举报
回复
int main(int argc, char* argv[])
{
int a[2][3]={{1,2,3},{4,5,6}},i,j;
//printf("%d\n",**a);
int **p=a;
printf("%d\n",**p);
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
printf("%d\t",*(*(a+i)+j));
}
printf("\n");
}

return 0;
}

這樣做,爲什麽我取p的值會出問題(**p),但是我直接用**a取值就沒問題
cansoft 2009-12-04
  • 打赏
  • 举报
回复
建议看看《C和指针》这本书,有专门讲到你这个问题的。

wanghao111,的正解!如果按一维数组来处理,Sizeof函数要注意。
kostion 2009-12-04
  • 打赏
  • 举报
回复
LZ发过同样的帖子了,怎么又发一次,没明白吗,回头好好看看上一个帖子的回复
z569362161 2009-12-04
  • 打赏
  • 举报
回复
a是首地址,地址也是指针
wanghao111 2009-12-04
  • 打赏
  • 举报
回复
[Quote=引用楼主 initiala 的回复:]
比如定义了这样的一个数组:int a[m][n];那么在编译的时候表达式中的a是指怎么被转换成一个int **类型的指针的?要详细点的过程~~
[/Quote]
不转换为int **,而是int (*p)[n],一个指向一维数组的指针
注:(*P)括号必须有
phpjspasp 2009-12-04
  • 打赏
  • 举报
回复
int b[10];
int *pb = b;
b的类型是int [10], b数组中每个元素的类型是int, 所以,b可以赋值给int *类型的变量。

int a[10][10];
int (*pa)[10] = a;

同理,a的类型就是 int [10][10],a数组中每个元素的类型是int [10],所以,a可以赋值给 int (*)[10]类型的变量。

编译的时候,a 是个符号,存在于符号表中。
从C语言的角度讲,int [10][10] 和 int ** 是完全不同的类型。
Apple_Demo 2009-12-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jackzhhuang 的回复:]
一般二维数组是通过一维数组实现的,直接强制转化为一个一维指针就可以。
[/Quote]
通过转化成一维数组实现。
bobommsky 2009-12-03
  • 打赏
  • 举报
回复
在二维数组A[m][n]中,实际上代表一个一维数组B[m],B[m]中的每个元素由n个元素组成,所以,A表示第0行0列的地址,即数组首地址。
A[i](i=0~m-1) 表示第i行第0列元素的地址。A[i]+j(j=0~n-1) 表示第i行第j列元素的地址。
因此,*(A[i]+j)就是A[i][j]。 又可以知道,A[i]与*(A+i)等价,故A[i][j]==*(*(A+i)+j)。

不知道你问的是不是这个意思?
liangyonglou 2009-12-03
  • 打赏
  • 举报
回复
编译将二维数组当成一维数组处理的,强制转化为一个一维指针
dbx12358 2009-12-03
  • 打赏
  • 举报
回复
你可以把每个行号的数组地址作为各列的数组首指针。
starix_cai 2009-12-03
  • 打赏
  • 举报
回复
楼上头像很赞。
二维数组int iarray[m][n]
指针iarray会转化为int* tmp[n]?
小梁_unique 2009-12-03
  • 打赏
  • 举报
回复
是转换为一位数组实现的:一维数组中的指针就简单了吧。
jackzhhuang 2009-12-02
  • 打赏
  • 举报
回复
一般二维数组是通过一维数组实现的,直接强制转化为一个一维指针就可以。
xiaoshun123 2009-12-02
  • 打赏
  • 举报
回复
这个帖子好像见过了???
james_hw 2009-12-02
  • 打赏
  • 举报
回复
[Quote=引用楼主 initiala 的回复:]
比如定义了这样的一个数组:int a[m][n];那么在编译的时候表达式中的a是指怎么被转换成一个int **类型的指针的?要详细点的过程~~
[/Quote]

帮你顶一下,我觉得编译器会在预编译某个过程中检验a的类型是否正确,但转换成汇编代码以后,a只是一个地址而已。因此不是像你所说的转换成int **类型。
bobo364 2009-12-02
  • 打赏
  • 举报
回复
肯定有个行号列号,先给行一个地址,行当中在分成列,每个列在有一个地址
bobo364 2009-12-02
  • 打赏
  • 举报
回复
编译器干嘛要转换数组成指针,编译时二维数组编译器是当成一位数组处理的

69,373

社区成员

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

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