C为什么将数组的第一个地址传递给char指针会提供整个字符串?

时间:2018-12-15 08:52:28

标签: c pointers char

我目前正在玩把char数组传递给char指针。我看到的许多示例都显示了在将char数组复制到字符串指针之前,如何需要分配该字符串指针将使用的内存。复制时,您遍历数组以将每个地址存储到分配的char指针中。

在下面的示例中,我没有初始化char指针,也没有迭代数组。我只是传递第一个元素的指针。

int main()
{
    char c[10] = "something";
    // char* new_c = (char *)malloc(strlen(c)+1);
    char *new_c = NULL;
    new_c = c;
    printf("%s", new_c);

    return 0;
}

为什么new_c仍在打印整个字符串?人们为什么还要遍历整个数组进行复制呢?

3 个答案:

答案 0 :(得分:3)

运行该程序,您将清楚了解正在发生的事情

#include <stdio.h>
#include <string.h>

int main(void) {
    char c[10] = "something";
    char *new_c = NULL;
    char new_c_2[10] = "";

    new_c = c; // copies address of 'c' to 'new_c' 


    for(int i=0; c[i]!='\0'; i++) {
        new_c_2[i] = c[i]; // copies value of 'c' to 'new_c_2'
    }

    // Data before changing the value of 'c'
    printf("\nData before changing the value of \'c\'\n");
    printf("new_c = %s\n", new_c);
    printf("new_c_2 = %s\n", new_c_2);

    strcpy(c, "changed");

    // Data after changing the value of 'c'
    printf("\nData after changing the value of \'c\'\n");
    printf("new_c = %s\n", new_c);
    printf("new_c_2 = %s\n", new_c_2);

    return 0;
}

输出:

Data before changing the value of 'c'
new_c = something
new_c_2 = something

Data after changing the value of 'c'
new_c = changed
new_c_2 = something

字符* new_c = NULL; new_c = c;

这些语句仅将'new_c'指向'c'的地址。 因此,如果您更改'c'的值并使用'new_c',它将转到'c'的地址并提供更新后的值。

我们将字符串复制到另一个字符串中,以便即使更改'c'的值也可以使用旧值。

有关更多详细信息,请参阅C编程中的按值调用和按引用调用。

答案 1 :(得分:1)

您说“我不初始化char指针”。您可以使用

new_c = c;

数组c会衰减为一个指针,就像您将c直接传递给printf一样。然后printf遍历数组直到找到零终止符。

答案 2 :(得分:0)

  

人们为什么还要遍历整个数组进行复制呢?

好吧,也许要确保一段时间后不会删除/覆盖原始参考。

例如,如果原始缓冲区是本地/自动变量,则从函数返回后将无效。

或者如果我只是做c[0] = '\0';new_c现在不显示任何内容,因为我只是杀死了字符串的唯一副本。

根据用例,复制和通过“浅”指针引用另一个字符串都是有用的。