gpt4 book ai didi

c - c中的字符串指针和字符数组

转载 作者:太空狗 更新时间:2023-10-29 16:53:14 24 4
gpt4 key购买 nike

我刚开始学习 C,发现对字符串指针和字符串(char 数组)有些混淆。谁能帮我理清头绪?

// source code
char name[10] = "Apple";
char *name2 = "Orange";

printf("the address of name: %p\n", name);
printf("the address of the first letter of name: %p\n", &(*name));
printf("first letter of name using pointer way: %c\n", *name);
printf("first letter of name using array way: %c\n", name[0]);
printf("---------------------------------------------\n");
printf("the address of name2: %p\n", name2);
printf("the address of the first letter of name2: %p\n", &(*name2));
printf("first letter of name2 using pointer way: %c\n", *name2);
printf("first letter of name2 using array way: %c\n", name2[0]);

// output
the address of name: 0x7fff1ee0ad50
the address of the first letter of name: 0x7fff1ee0ad50
first letter of name using pointer way: A
first letter of name using array way: A
---------------------------------------------
the address of name2: 0x4007b8
the address of the first letter of name2: 0x4007b8
first letter of name2 using pointer way: O
first letter of name2 using array way: O

所以我假设 name 和 name2 都指向它们自己的第一个字母的地址。那么我的困惑是(见下面的代码)

//code
char *name3; // initialize a char pointer
name3 = "Apple"; // point to the first letter of "Apple", no compile error

char name4[10]; // reserve 10 space in the memory
name4 = "Apple"; // compile errorrrr!!!!!!!!!!

我创建了一个名为 name2 的 char 指针,name2 指针指向“Apple”的第一个字母,这很好,然后我创建了另一个 char 数组并在内存中分配了 10 个空间。然后尝试使用 name4,它是指向“Apple”首字母的地址。结果,我遇到了编译错误。

我对这种编程语言感到非常沮丧。有时他们的工作方式相同。但有时他们没有。谁能解释原因,如果我真的想在分隔的行中创建一个字符串或字符数组。我该怎么做???

非常感谢...

最佳答案

你可以在声明的时候初始化一个数组,像这样:

int n[5] = { 0, 1, 2, 3, 4 };
char c[5] = { 'd', 'a', 't', 'a', '\0' };

但由于我们通常将 char 数组视为字符串,因此 C 允许一种特殊情况:

char c[5] = "data";  // Terminating null character is added.

但是,一旦你声明了一个数组,你就不能重新分配它。为什么?考虑这样的作业

char *my_str = "foo";  // Declare and initialize a char pointer.
my_str = "bar"; // Change its value.

第一行声明了一个字符指针并将其“瞄准”foo 中的第一个字母。由于 foo 是一个字符串常量,它与所有其他常量一起驻留在内存中的某个位置。当您重新分配指针时,您正在为其分配一个新值:bar 的地址。但是原始字符串 foo 保持不变。您移动了指针,但并未更改数据。

然而,当您声明一个数组时,您根本就没有声明一个指针。您正在保留一定数量的内存并为其命名。所以行

char c[5] = "data";

以字符串常量data开始,然后分配5个新字节,称它们为c,并将字符串复制到其中。您可以访问数组的元素,就像您声明了指向它们的指针一样;数组和指针(对于大多数用途)以这种方式可以互换。

但由于数组不是指针,您不能重新分配它们。

你不能让c“指向”其他任何地方,因为它不是一个指针;它是内存区域的名称。

可以更改字符串的值,一次可以更改一个字符,也可以调用 strcpy() 之类的函数:

c[3] = 'e';       // Now c = "date", or 'd', 'a', 't', 'e', '\0'
strcpy(c, "hi"); // Now c = 'h', 'i', '\0', 'e', '\0'
strcpy(c, "too long!") // Error: overflows into memory we don't own.

效率提示

另外请注意,初始化数组通常会复制数据:原始字符串从常量区复制到数据区,您的程序可以在数据区更改它。当然,这意味着您使用的内存是预期的两倍。您可以通过声明指针来避免复制并通常节省内存。这会将字符串留在常量区域中,并只为指针分配足够的内存,而不管字符串的长度如何。

关于c - c中的字符串指针和字符数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17077505/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com