3

我是 C 编程的新手。我对指针的混乱行为感到困惑。特别是在涉及字符串和数组时。

我知道我写不出来

#include <stdio.h>
int main()
{
 int *number=5;
 printf("%d",*number);
} 

因为显然它会尝试写入内存的第 5 个位置。这会使程序崩溃。我必须初始化“数字”。

但是当涉及到字符串时,我可以这样写,

#include <stdio.h>
int main()
{
 char *name="xxxxx";
 printf(name);
} 

它也有效。所以这意味着它隐式初始化“name”指针。我也知道 name=&name[0] 但我也发现了 name=&name。怎么会这样?因为,对我来说,它看起来是两个同名的变量。谁能告诉我字符串是如何在内存中创建的?(一直以来,我假设它创建了 name[0].....name[n-1] 和另一个名为“name”的变量(一个指针),在里面我们把名字[0]的位置。似乎是我错了。)

PS:-我的英语可能不太好,如果有人能给我一个关于上述问题的链接,将不胜感激。

4

5 回答 5

4

像许多编程语言一样,C 支持“文字”的概念——特殊语法,当遇到这种语法时,编译器会以一种特殊的方式创建一个值。

-2,例如,是一个整数文字。遇到时,编译器会将其视为int内容为 -2 的类型值。"..."是一个字符串文字- 遇到时,编译器会在一个特殊的内存区域分配新空间,用与您在文字中使用的字符相对应的数据填充它,在该区域的末尾添加一个 0,最后使用指向该区域,类型char*为 ,作为文字表达式的结果。char* s = "hello"从某种类型的东西到类型char*变量的赋值也是如此char*——完全合法。

你在这里偷偷问了另一个问题——为什么a == &a[0]。最好一次问一个问题,但其要点a[n]与 相同*((a)+(n)),因此:

&a[0] == &*(a+0) == a+0 == a
于 2013-05-02T08:59:45.270 回答
2
 char *name="xxxxx";

这会在内存中创建一个char array(const),并将其第一个元素的地址分配给name. char* 数组名称就像指针。&name[0]表示第一个元素的地址,并且name(在 c,cpp 中,只有char *数组名称也会为您提供第一个元素的地址(bcos 这是name在第一个位置本身分配的地址))也给出相同的结果。

符号name[i]被翻译成*(name+i)你实际上有一个基地址name,你可以在其中添加下标。(计算按指针算术)。printf("%s", name)旨在从起始地址打印到\0(附加到使用char*又名字符串文字创建的字符串的末尾)

也检查一下

于 2013-05-02T09:01:22.467 回答
1

基本上当 C 编译器看到表达式时会发生什么

char *name = "xxxxx";

是,它会说。嘿"xxxxx",这是一个常量字符串(它是一个以字节结尾的0字节数组),并将其放入生成的程序二进制文件中。然后它将用字符串替换内存位置,有点像:

char *name = _some_secret_name_the_compiler_only_know;

where_some_secret_name_the_compiler_only_know是指向程序执行后字符串所在的内存位置的指针。并开始解析文件。

于 2013-05-02T09:10:26.170 回答
1

那是因为你这些字符串实际上是字符数组。你用这条线做什么char *name = "xxxxx";:你构造了一个由 6 个字符值组成的数组(其中 5 个是'x',最后一个是'\0')。name是指向该数组的指针。

这就是 C 中通常处理字符串的方式,你有某种字符序列,以字符结尾'\0',告诉函数printf在哪里停止处理字符串。

于 2013-05-02T08:52:15.047 回答
1

让我们考虑这段代码:

 char *name="xxxxx";

这里发生的是字符串xxxxx被分配内存和指向该内存位置的指针,或者该address字符串的 传递给pointer变量。或者name换句话说,您name使用该地址进行初始化。

Andprintf()是一个可变参数函数(一个接受一个固定参数,后跟一个随机数量的参数)。第一个参数printf()是类型。当作为参数传递时const char*,字符串标识符表示该字符串的基地址。因此您可以使用name

printf(name);

它只会输出xxxxx

name=&name too. How can it be?——嗯,这是一个有道理的问题。

让我先用一个现实世界的类比来解释一下。假设您在住房协会的一排房屋中拥有第一所房屋。假设它是地块编号0。其他房屋位于地块 1,2,3 ......现在假设有一个指向您的房子的指针,并且那里是整个房协的另一个指针。两个指针不会有相同的地址plot 0吗?这是因为指针表示单个内存位置type。这里重要的是指针的地址。

将此类比为字符串(字符数组),name标识符仅表示字符串的基地址,即其第一个字符的地址(如第一所房子的地址)。它在数字上与整个字符串的地址相同,也就是(&name),在我的类比中是房屋的 ROW。但它们的类型不同,一个是类型char*,另一个是类型char**

于 2013-05-02T08:53:50.627 回答