您可以通过阅读有关 SO 的相关问题来开始解决您的指针/数组/字符串问题。不乏这样的问题。
为了编写包含指针/数组/字符串的正确 C 代码,您必须学习和理解一些重要的事情:
- 指针、数组、指向指针的指针、指向数组的指针、数组的数组、指针的数组等等的声明。对于外行来说,C 声明确实很奇怪。但是,它们是可学习的,并且有一些类似的工具
cdecl
可以快速将 abracadabrish 声明翻译成简单的英语或其他方式。
- 如果你看到一个函数将它的一个参数声明为一个数组(例如
void f(int a[])
),不要相信你的眼睛。它是一个指针,而不是一个数组。在 C 中,数组永远不会作为函数参数传递。仅传递指针。语法具有欺骗性,C 语言的创建者已经/对这样的事情感到抱歉,但现在这都是历史了。你不能改变它。
- 在所有 C 表达式中(不要与声明和定义混淆),除了大约一个,数组表现为指向其第一个元素的指针。运营商是个例外
sizeof
。sizeof(array)
将返回你真正的数组大小chars
。但是当你这样做的时候sizeof(array+0)
,你已经转换array
为指向指针类型的表达式,array[0]
在这种情况下sizeof
将返回指针的大小。
- 您不能分配数组。您可以在定义它们时初始化它们,您可以复制它们,但在定义它们
=
之后不能分配。
- C 中没有基本类型形式的字符串。只有
chars
, 数组chars
和指向数组的指针chars
和指向数组的指针chars
,我们经常将它们都称为字符串,但实际上并非如此。您看到的字符串,例如"I am a string. Or maybe I'm not."
称为字符串文字,并且在某处有一个chars
与之关联的数组。我在某处说,因为字符串文字在不同的上下文中表现不同。在所有 C 表达式(不要与声明/定义混淆)中,除了大约一个之外,字符串文字表现为指向char
包含文字文本的数组的第一个的指针。再次,例外是sizeof
。chars
它会以类似的方式返回底层数组的大小sizeof("ABC")
. 同样,就像数组一样,在您编写 的那一刻sizeof("ABC"+0)
,您已转换"ABC"
为指向的指针char
并将sizeof
返回指针的大小。
- 您不得尝试修改
char
由字符串文字创建的数组:"ABC"[0] = 'Z';
这是未定义的行为。char* p = "ABC"; p[0] = 'Z';
或等价物也是如此char* p = "ABC"; *p = 'Z';
。
- 您可以使用字符串文字来初始化数组
chars
或指向的指针chars
(您也可以将字符串文字分配给指针,但不能分配给数组,数组不可分配,如前所述)。会发生什么取决于您正在初始化什么。Inchar a[] = "Hello";
或 inchar a[] = { "Hello!" };
您创建一个数组,chars
并将其内容设置为字符串文字中的文本。如果需要,您可以在之后修改该数组。在char* p = "World!";
您创建一个char
包含文字字符串文本的数组,并创建一个指向该数组char
第一个的指针char
。在这种情况下,您不能像我之前指出的那样更改数组。
- 由空格分隔的两个或多个相邻字符串文字合并为一个:
"Hello" " World!"
与"Hello World!"
.
- 还有指针算术,但很简单。
这是关于它的。主声明、表达式和函数参数中的主数组,注意你的字符串文字。