GCC对int*a={1,2,3,4,5}的语句做了什么? #包括 int main(){ int*a={1,2,3,4,5}; printf(“a:%x&a:%x\n”,a,&a); 返回0; }

GCC对int*a={1,2,3,4,5}的语句做了什么? #包括 int main(){ int*a={1,2,3,4,5}; printf(“a:%x&a:%x\n”,a,&a); 返回0; },c,gcc,C,Gcc,我用GCC编译了这个程序。 a的输出是1,而&a的输出是地址。 GCC对int*a={1,2,3,4,5}做了什么?GCC是否将其视为数组或指向数组或其他对象的指针?我没有参考C标准,但您可以从编译警告消息中看到GCC如何处理此问题: [步骤101]#cat foo.c int main() { int*a={1,2}; 返回!!a; } [步骤102]#通用条款-沃尔富 foo.c:在函数“main”中: foo.c:3:16:警告:初始化从整数生成指针 没有强制转换[-Wint转换] int

我用GCC编译了这个程序。
a
的输出是
1
,而
&a
的输出是地址。
GCC对int*a={1,2,3,4,5}做了什么?GCC是否将其视为数组或指向数组或其他对象的指针?

我没有参考C标准,但您可以从编译警告消息中看到GCC如何处理此问题:

[步骤101]#cat foo.c
int main()
{
int*a={1,2};
返回!!a;
}
[步骤102]#通用条款-沃尔富
foo.c:在函数“main”中:
foo.c:3:16:警告:初始化从整数生成指针
没有强制转换[-Wint转换]
int*a={1,2};
^
foo.c:3:16:注意:(接近“a”的初始化)
foo.c:3:19:警告:标量初始值设定项中的元素过多
int*a={1,2};
^
foo.c:3:19:注意:(接近“a”的初始化)
[步骤103]#
更新:

只需查看,并在第6.7.8节初始化中找到:

标量的初始值设定项应为单个表达式,可以选择用大括号括起来。


该代码违反了约束,因为非聚合的初始值设定项只能包含1个元素

GCC有一个“扩展”来忽略多余的初始值设定项,因此它将代码视为
int*p=1。这也是一种约束冲突,因为不能将整数指定给指针。但是gcc有另一个“扩展”来处理这样的代码,比如
int*p=(int*)1。因此,您将得到一个指向地址1的指针

&a的输出是一个地址


&a
是变量
a
在内存中的地址,这与
a
中存储的值无关

不要发布代码的图片,发布实际代码。不是因为我们无法读取代码的图像,而是因为它们是代码,应该这样发布。有人可能还想复制并粘贴它来运行它。在大多数情况下
int*a={1,2,3,4,5}真的吗?逗号在这里用作运算符。这就是为什么当a={1,2,3,4,5}等价于“(a=1),2,3,4,5”)时,会得到a=1,*a指向一个整数。
#include <stdio.h>
int main(){
  int *a = {1,2,3,4,5};
  printf("a:%x &a:%x\n",a,&a);
  return 0;
}