RY_01 2022-01-26 02:54 采纳率: 100%
浏览 45
已结题

关于二维数组初始化后的整体赋值(语言-c语言)

main()
{
int a[2][2]={0},z[1]={2};
// a[0]=z;
scanf("%d",&a[0]);
// a[0]=1;
printf("%d",a[0][0]);
char *s[2];
s[0]="abc";

}

定义一个数组后,不能再整体赋值,把另外一个数组直接传递给这个数组,在编译器的ERROR看到提示是数据类型不同,我猜测是因为z被视作了一个指针,而a[0]是一个整型,编译器又不能转换,所以行不通,在这个推测下,我又尝试了直接给a[0]赋值一个整数,但是依旧无法通过编译,可能是因为a[2][2]为一个二维数组,但是神奇的是,我们用scanf函数,却又可以给a[0],我不知道其中原理,同时char *s[2]; s[0]="abc";这样的数组为什么也能通过编译,s[1]不应该也是一个指针吗,这其中是否进行了类型转换?

  • 写回答

2条回答 默认 最新

  • SmallAntJ 2022-01-26 06:11
    关注

    a[0]不是int,而是int指针,a[0]和&a[0][0]是一样的, z也是int指针。虽然a[0]和z都是int指针,但是a[0]不能被赋值,a[0]=z;和a[0]=1;都是会报ERROR的,我测试的编译器是GCC 5.4.0。

    a, a[0], &a[0][0], &a[0]四个指针的值都是相同的,就是指向同一个地址,可以通过printf("%p,%p,%p,%p\n",a,a[0],&a[0][0],&a[0]);来验证。区别是在指针值+1的时候,也就是printf("%p,%p,%p,%p\n",a+1,a[0]+1,&a[0][0]+1,&a[0]+1);,此时a+1和&a[0]+1是原地址值+8,a[0]+1和&a[0][0]+1是原地址值+4。

    这里scanf语句是有问题的,给a[0][0]赋值的话,“%d”需要一个int *,也就是scanf("%d",&a[0][0]),和scanf("%d",a[0]);是等价的,至于&a[0]可以的话我猜是因为地址值是和&a[0][0]一样的,应该是编译器做了类型转换。

    char *s[2]; s[0]="abc"; 是可以的,没有类型转换。s是char指针的数组,所以s[0]和s[1]存放的是char指针,s[0]="abc";是将字符串“abc”的首地址赋值给s[0],而s[1]没有被赋值。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月3日
  • 已采纳回答 1月26日
  • 创建了问题 1月26日

悬赏问题

  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加
  • ¥15 用ns3仿真出5G核心网网元
  • ¥15 matlab答疑 关于海上风电的爬坡事件检测
  • ¥88 python部署量化回测异常问题
  • ¥30 酬劳2w元求合作写文章
  • ¥15 在现有系统基础上增加功能
  • ¥15 远程桌面文档内容复制粘贴,格式会变化
  • ¥15 这种微信登录授权 谁可以做啊
  • ¥15 请问我该如何添加自己的数据去运行蚁群算法代码