数组和指针的转换

Initiala 2009-12-02 03:28:11
比如定义了这样的一个数组:int a[m][n];那么在编译的时候表达式中的a是指怎么被转换成一个int **类型的指针的?要详细点的过程~~
...全文
820 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
  • 打赏
  • 举报
回复
编译器干嘛要转换数组成指针,编译时二维数组编译器是当成一位数组处理的
内容概要:本报告基于寻汇与万事达卡在2026年联合发布的《超越自动化:定义智能体驱动的全球支付》白皮书,系统分析了AI智能体在B2B跨境支付领域的应用与发展。报告指出,传统跨境支付存在效率低、人工干预多、合规风险高等问题,当前正从数字化、数据化迈向“自主化”新阶段。AI智能体可在授权下自主完成支付、换汇、合规审核、对账等全流程操作,核心技术包括深度强化学习、自然语言处理和图神经网络,用于路径优化、合规解析与异常检测。报告揭示了决策可解释性不足、跨系统协同标准缺失、安全审计机制缺位三大研究空白,并探讨了法律责任归属、监管碎片化、数据主权与技术可靠性四大现实挑战。寻汇与万事达卡的合作构建了“智能体编排引擎”与全球合规决策网络,首次提出L0-L5的智能体自主化等级框架,推动行业标准化。预计2026至2027年将实现首批大规模商业部署,提升支付效率超30%。; 适合人群:金融科技研究人员、AI技术开发者、跨境支付行业从业者、企业财资管理人员及政策监管机构相关人员。; 使用场景及目标:①理解AI智能体在跨境支付中的技术架构与应用场景;②把握自主化支付的演进趋势与商业化前景;③为金融机构和技术公司布局AI驱动型支付系统提供战略参考;④助力监管机构制定适应智能体时代的合规框架。; 阅读建议:本报告兼具技术深度与产业视野,建议结合白皮书原文及相关技术文献对照研读,重点关注智能体决策逻辑、合规实现机制与跨系统集成方案,并关注后续试点项目的实际成效与监管反馈。

70,039

社区成员

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

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