【发布时间】:2015-09-18 03:27:40
【问题描述】:
在 C99 中,通常使用 char* 数据类型初始化字符串,因为没有原始的“字符串”数据类型。这通过将第一个字符的地址存储在变量中来有效地创建一个字符数组:
FILE* out = fopen("out.txt", "w");
char* s = argv[1];
fwrite(s, 12, 1, out);
fclose(out);
//successfully prints out 12 characters from argv[1] as a consecutive string.
编译器如何知道char* s 是一个字符串而不仅仅是一个单数char 的地址?如果我使用int*,它将只允许一个int,而不是它们的数组。为什么会有差异?
我的主要关注点是了解指针、引用和取消引用是如何工作的,但整个 char* 总是让我头疼。
【问题讨论】:
-
编译器不知道
char* s是一个字符串。char* s是指向 char 的指针,就像int* s是指向 int 的指针一样。只要我们到达最后一个'\0',我们就可以得到整个字符串。 -
"如果我使用 int* 它将只允许一个 int"。这不是真的。在 C 中,
int*可以用作数组。 -
@AlanAu:不,指针不能用作数组。
-
数组和指针之间的关系可能会令人困惑。 comp.lang.c FAQ 的第 6 节很好地解释了它。
-
@AlanAu:
i_array是一个指针,而不是一个数组。[]运算符的前缀必须是指针(这通常是数组隐式转换的结果)。 (实际上[]是可交换的,但这不是重点。)