【问题标题】:C: array pointer pointing to its own address and carrying a value at the same time?C:数组指针指向自己的地址,同时携带一个值?
【发布时间】:2015-03-14 18:27:57
【问题描述】:

我是c新手

所以在 c 中, 如果我在 main 方法中执行以下操作,

int* a = malloc( sizeof( int ) );
a[0] = 1;
printf( "%x\n", a ); // 1d02230
printf( "%x\n", &a ); // 4bed1c00
printf( "%x\n", a[0] ); // 1
printf( "%x\n", &a[0] ); // 1d02230

这对我来说很有意义。 但是当我执行以下操作时,

int b[] = {1};
printf( "%x\n", b ); // 4bed1bf0
printf( "%x\n", &b ); // 4bed1bf0
printf( "%x\n", b[0] ); // 1
printf( "%x\n", &b[0] ); // 4bed1bf0

这对我来说没有意义......看起来b是一个指向它自己地址的指针,它也带有值1。我怀疑它与b是一个静态数组有关,但是怎么做我明白了????

【问题讨论】:

  • @CarlNorum:在第二个示例中,bint 的数组,而不是指针数组。
  • 阅读comp.lang.c FAQ的第6部分。
  • @KeithThompson 这是我的错误,我最初有一个错字,我输入了 int* b[]。后来我更正了。
  • @CarlNorum:对不起,我应该检查一下编辑历史。
  • 没问题。评论已删除;我修正了我的答案以匹配。

标签: c arrays


【解决方案1】:

指针和数组不是一回事。在大多数情况下,数组 衰减 成指向它们的第一个元素的指针,但当它们是一元 & 运算符的参数时则不会。这意味着您的第二个示例意味着:

printf( "%x\n", b );     // array name decays, 100% equivalent to &b[0]
                         //   type: int *
printf( "%x\n", &b );    // name does *not* decay, gives address of array
                         //   type: int (*)[1]
printf( "%x\n", b[0] );  // value of array element 0
                         //   type: int
printf( "%x\n", &b[0] ); // address of array element 0, same as line 1
                         //   type: int *

相比之下,你的第一个例子:

printf( "%x\n", a );     // value of pointer a
                         //   type: int *
printf( "%x\n", &a );    // address of pointer a
                         //   type: int **
printf( "%x\n", a[0] );  // value of element pointed to by a
                         //   type: int
printf( "%x\n", &a[0] ); // address of element pointed to by a (equivalent to a)
                         //   type: int *

请注意,%x 不是用于大多数打印语句的正确格式;你很幸运能侥幸逃脱,但严格来说这是未定义的行为。

【讨论】:

  • 非常感谢。这真的很有帮助!
  • 要打印一个指针值,将其转换为void*并使用%p:printf("%p\n", (void*)&a);
  • 对于“数组元素 0 的值”(即 b[0]),您说类型是 int*。这不应该是 int 吗?
  • 我会修正答案以匹配。
猜你喜欢
  • 1970-01-01
  • 2019-05-10
  • 1970-01-01
  • 2016-08-11
  • 1970-01-01
  • 2013-03-31
  • 1970-01-01
  • 2012-10-18
  • 1970-01-01
相关资源
最近更新 更多