指针声明和数组声明(例如 char *a 和 char a[] )具体都有哪些区别?

本文探讨了C语言中指针和数组声明的差异,包括它们的内存分配、赋值行为以及类型转换。文章通过实例分析了为什么`char *a`可以赋值字符串常量,而`char a[]`不行,以及`char a[] = "abcde"`与`char *b = "abcde"`的初始化区别。同时,解释了为什么`a`作为右值时类型被视为`char*`,而作为左值时保持`char[6]`的类型。最后,讨论了数组不能作为左值赋值的原因。
摘要由CSDN通过智能技术生成

来自知乎 https://www.zhihu.com/question/26117197

问题

具体来说,下面这些情况让我感到疑惑:

  1. 既然 char *a 只是定义了一个指针 a,而并不为其指向的字符串分配内存,那么为什么下面两行代码又能够编译通过,且执行结果看上去是正常的?
    char *a;
    a = “abcde”;
    这两行程序的执行过程中,编译器/计算机都做了些什么?
    在这两行程序的基础上,为什么赋值语句 *a = ‘A’ 又是不合法的(会导致运行时错误)?
    相比于上面两行程序,以下两行也是不合法的,为什么?
    char a[];
    a = “abcde”;

  2. 以下两种初始化方式是否有本质区别?
    char a[] = “abcde”;
    char *b = “abcde”;

  3. 为什么下面的代码
    char *a, *b;
    a = “abcde”; b = “abcde”;
    其运行结果中, a 和 b 会指向同一内存地址?而上一问中得到的 a 和 b 就不会指向同一内存地址。

  4. 对于数组声明(或初始化)的变量,例如
    char a[6];

    char a[]=“abcde”;
    这句话是否正确?当 a 作为右值(rvalue)时,其类型为 char*;而当 a 作为左值(lvalue)时,其类型就是 char[6]。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值