首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指针在C数组中的应用

指针在C数组中的应用
EN

Stack Overflow用户
提问于 2022-04-10 11:58:28
回答 1查看 43关注 0票数 -1

我精确地在下面写下代码,它应该生成"2036,2036,2036“,但是每当我反复按"Run”按钮时,它就会返回8-9位数的奇怪随机值。

有人知道吗?

代码语言:javascript
复制
 #include <stdio.h>
 int main() 
  { 
  unsigned int x[4][3] = {{1, 2, 3}, {4, 5, 6}, 
                       {7, 8, 9}, {10, 11, 12}};
  printf("%u, %u, %u", x+3, *(x+3), *(x+2)+3);
  } 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-10 12:06:24

您声明了一个二维数组。

代码语言:javascript
复制
unsigned int x[4][3] = {{1, 2, 3}, {4, 5, 6}, 
                        {7, 8, 9}, {10, 11, 12}};

用于调用pf printf中的参数表达式。

代码语言:javascript
复制
printf("%u, %u, %u", x+3, *(x+3), *(x+2)+3);

它被隐式转换为指向类型unsigned int ( * )[3]的第一个元素的指针。

因此,x + 3是指向数组的第四行的指针,您试图将其作为一个无符号int输出,从而导致未定义的行为。

表达式*( x + 3 )生成数组的第四行,该数组被隐式转换为指向行的第一个元素的指针。因此,数组第四行的第一个元素的地址被输出为一个无符号int,它再次调用未定义的行为。

表达式*(x+2)给出了上面描述的第三行的第一个元素。因此,表达式*(x+2)+3在第三行的最后一个元素之后产生内存的地址。

只需重写printf的调用就可以了

代码语言:javascript
复制
printf("%p, %u, %u\n", ( void * )( x+3 ), **(x+3), **(x+2)+3);

您将得到第四行的地址、第四行( 10 )的第一个元素的值和第三行(7)的第一个元素的值加上3,即10。

否则你需要写

代码语言:javascript
复制
printf("%p, %p, %p\n", ( void * )( x+3 ), ( void * )( *(x+3) ), ( void * )( *(x+2)+3 ) );

若要输出具有指针类型的原始表达式,请执行以下操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71816365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档