【问题标题】:char * vs char[] and much morechar * vs char[] 等等
【发布时间】:2021-12-05 02:57:37
【问题描述】:

我对 C 处理字符串的方式以及 char *char[] 的方式感到困惑。

char name[10] = "asd";
printf("%p\n%p", &name, &name[0]); //0x7ffed617acd
                                                                //0x7ffed617acd

如果这段代码为两个参数提供了相同的地址,这是否意味着 C 编译器将 char 数组(字符串)作为指向数组中第一个 char 的指针并在内存中移动直到它得到空终止符?如果我们将char name[] 更改为char *name,为什么不会发生同样的情况? (我知道它们有所不同,但是是什么让 C 以不同的方式看待两者?)

我知道数组在声明后不能被赋值(除非你使用了类似 strcpy、strcat 的东西),这也让人困惑。为什么 C 不将它们视为任何其他数据类型? (有些东西告诉我编译器有一个特定的地址,而你可以将char* 分配给内存中的任何位置,因为它是一个指针)。

我知道char * 具有固定大小,这与char[] 不同,这使得char * 不能用于strcat 的第一个参数。

【问题讨论】:

    标签: arrays c string pointers


    【解决方案1】:

    这是否意味着c编译器将char数组(字符串)作为指向数组中第一个char的指针

    数组不是指针。但是数组将隐式转换为指向第一个元素的指针。这种转化称为“衰变”。

    ...并在内存中移动,直到它得到空终止符???

    如果你知道指针指向一个空终止字符串的元素,你可以编写这样的循环。如果你写了那个循环,那么编译器就会产生一个做这种事情的程序。

    如果我们将 char name[] 更改为 char *name,为什么不会发生同样的情况?

    你的前提是错误的。您可以直接迭代数组,也可以使用指针。

    如果这段代码为两个参数提供了相同的地址,是否意味着

    对象的地址是对象的第一个字节。这个“同地址”的意思是数组的第一个元素的第一个字节与整个数组的第一个字节在同一个地址。

    我知道数组在声明后不能被赋值(除非你使用了类似 strcpy、strcat 的东西),这也令人困惑。

    strcpystrcat 都不分配数组。它们分配数组的元素,您也可以在不调用这些函数的情况下执行此操作。

    为什么 C 不将它们视为任何其他数据类型?

    这个问题不清楚。 “C 带走他们”是什么意思?为什么你认为 C 应该采用另一种数据类型?您认为应该采用哪种数据类型?


    char name[10] = "asd";
    printf("%p\n%p", &name, &name[0]);
    

    参数的类型分别为char(*)[10]char*%p 格式说明符要求参数的类型类似于void*,而void* 与那些参数不相似。传递格式说明符所需类型以外的类型的参数会导致未定义的行为。使用 %p 时,应将其他指针类型转换为 void*

    【讨论】:

      【解决方案2】:

      在 C 中,“字符串”是“字符”类型的数组(以 \0 结尾)。 当您在 C 中引用数组时,您使用的是指向第一个元素的指针。在这种情况下 (char *)。

      根据 ANSI-C 标准,数组的名称是指向第一个元素的指针。

      能够编写name 而不是&name[0] 是语法糖。 以同样的方式访问写入name[i] 的数组元素类似于写入*(name+i)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多