【问题标题】:char *array and char array[]char *array 和 char 数组[]
【发布时间】:2013-12-19 06:36:15
【问题描述】:

如果我写这个

 char *array = "One good thing about music";

我实际上创建了一个数组?我的意思是这样的吗?

char array[] = {"One", "good", "thing", "about", "music"};

【问题讨论】:

  • 所做的编辑使代码有缺陷,或者至少有缺陷。 T在第二个例子中,array 是一个 characters 数组,用 pointers 对字符进行初始化。如果需要一个字符串数组,那么声明应该是char *array[] = { ... }

标签: c arrays pointers char


【解决方案1】:

没有。其实和“一样”

char array[] = {'O', 'n', 'e', ..... 'i','c','\0');

每个字符都是一个单独的元素,另外还有一个 \0 字符作为字符串终止符。

我引用了“相同”,因为char * arraychar array[] 之间存在一些差异。 如果您想了解更多信息,请查看C: differences between char pointer and array

【讨论】:

  • 这些不是“次要”差异。最好澄清它们,而不是让 OP 和未来的读者感到困惑。
  • 只读数组如何是 "minor" 差异,并且与 OP 无关?如果你这么说,接下来的 15 分钟内肯定会有后续问题
  • 我只是链接到正确的主题,而不是重复文本。
  • 是的,可能这里没有“次要”这个词。
【解决方案2】:

声明和初始化

char *array = "One good thing about music";

声明一个指针array,并使其指向一个31个字符的常量数组。

声明和初始化

char array[] = "One, good, thing, about, music";

声明一个字符数组,包含 31 个字符。

是的,数组的大小是 31,因为它包括终止符 '\0'


放在内存中,第一次是这样的:

+--------+ +-----------------+ |数组 | --> | “关于音乐的一件好事” | +--------+ +-----------------+

第二个是这样的:

+------------------------------+ | “关于音乐的一件好事” | +------------------------------+

数组衰减为指向数组第一个元素的指针。如果你有一个像

这样的数组
char array[] = "One, good, thing, about, music";

然后在需要指针时使用普通的array,它与&array[0] 相同。

这意味着,例如,当您将数组作为参数传递给函数时,它将作为指针传递。

指针和数组几乎可以互换。例如,您不能使用sizeof(pointer),因为它返回的是实际指针的大小,而不是它指向的内容。当你这样做时,例如&pointer 你得到了指针的地址,但是&array 返回了一个指向数组的指针。应该注意的是,&arrayarray(或其等效的&array[0]非常不同。虽然&array&array[0] 都指向同一个位置,但类型不同。使用上面的数组,&array 的类型为char (*)[31],而&array[0] 的类型为char *


为了更有趣:众所周知,在访问指针时可以使用数组索引。但是由于数组衰减为指针,因此可以对数组使用一些指针算法。

例如:

char array[] = "Foobar";  /* Declare an array of 7 characters */

使用上述方法,您可以使用任一方法访问第四个元素('b' 字符)

array[3]

*(array + 3)

又因为加法是commutative,最后也可以表示为

*(3 + array)

这导致了有趣的语法

3[array]

【讨论】:

  • 在第二条命令中,可以使用array作为指向该数组的指针吗?
  • @Nat95 用另一段更​​新了我的答案。
  • &array是指向数组的指针,而不是指向第一个元素的指针,即&array[0]
  • 您忘记了 char* 字符串文字示例中的逗号。
  • 我认为这个答案需要更新以跟上原始问题的变化!
【解决方案3】:

很像

char array[] = {'O', 'n', 'e', ' ', /*etc*/ ' ', 'm', 'u', 's', 'i', 'c', '\0'};

但给你只读内存。

有关char[]char * 之间区别的讨论,请参阅comp.lang.c FAQ 1.32

【讨论】:

  • 这意味着如果你尝试写入它(例如array[0] = 'X')你会得到未定义的行为(通常是分段错误)。
【解决方案4】:

不,您正在创建一个数组,但有很大的不同:

char *string = "Some CONSTANT string";
printf("%c\n", string[1]);//prints o
string[1] = 'v';//INVALID!!

数组是在内存的只读部分创建的,所以你不能通过指针编辑值,然而:

char string[] = "Some string";

创建相同的只读常量字符串,并将其复制到堆栈数组。这就是为什么:

string[1] = 'v';

在后一种情况下有效。
如果你写:

char string[] = {"some", " string"};

编译器应该抱怨,因为您正在构造一个 char 数组(或 char 指针)的数组,并将其分配给一个 char 数组。这些类型不匹配。要么写:

char string[] = {'s','o','m', 'e', ' ', 's', 't','r','i','n','g', '\o'};
//this is a bit silly, because it's the same as char string[] = "some string";
//or
char *string[] = {"some", " string"};//array of pointers to CONSTANT strings
//or
char string[][10] = {"some", " string"};

最后一个版本为您提供了一个字符串数组(字符数组),您实际上可以编辑...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 2012-06-03
    • 2015-06-07
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多