[英]Pointers to strings
我是C编程的新手。 我对指针的混乱行为感到困惑。 特别是涉及字符串和数组时。
我知道我写得不像
#include <stdio.h>
int main()
{
int *number=5;
printf("%d",*number);
}
因为很明显它会尝试写入内存的第五个位置。这会使程序崩溃。我必须初始化“数字”。
但是当谈到字符串我可以这样写,
#include <stdio.h>
int main()
{
char *name="xxxxx";
printf(name);
}
它也有效。 所以这意味着它隐式初始化“name”指针。我也知道name =&name [0]但我发现name =&name也是如此。 怎么可能? 因为,对我而言,它看起来有两个同名的变量。 任何人都可以告诉我如何在内存中创建字符串吗?(这一次我假设它创建名称[0] .....名称[n-1]和另一个名为“name”的变量(指针),在我们内部把名字[0]的位置。看到我错了。)
PS: - 我的英语可能不太好,如果有人能给我一个关于上述事情的链接,那将是感激的。
与许多编程语言一样,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
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*
aka String literals创建的字符串的末尾)
检查一下 。
那是因为你这些字符串实际上是字符数组。 你用line char *name = "xxxxx";
做什么char *name = "xxxxx";
:您构造一个包含6个字符值的数组(其中5个为'x'
,最后一个为'\\0'
)。 name
是指向该数组的指针。
这就是字符串在C中通常处理的方式,你有一些字符序列,以'\\0'
字符结尾,告诉像printf
这样的printf
停止处理字符串。
让我们考虑一下这段代码:
char *name="xxxxx";
这里发生的是字符串xxxxx
被分配内存和指向该内存位置的指针 ,或者该字符串的address
被传递给pointer
变量name
。或者换句话说,您使用该地址初始化name
。
printf()
是一个可变函数(一个带有一个固定参数后跟一个随机数量的参数) printf()
第一个参数是const char*
类型。当作为参数传递时,字符串标识符name
表示该字符串的基地址。您可以使用
printf(name);
它只会输出xxxxx
name=&name too. How can it be?
- 这是一个合理的问题。
让我先用现实世界的比喻来解释。 假设你在住房社会中拥有一排房屋中的第一栋房屋。假设它的地块编号为0
其他房屋位于地块1,2,3 ......现在假设有一个指向你房子的指针 ,并且还有另一个指向整个住房社会排的指针 。 两个指针不会有相同的地址,这将是plot 0
吗?这是因为指针表示单个内存位置。这是指针的type
。
将这个类比带到字符串(字符数组), name
标识符只表示字符串的基地址,第一个字符的地址(就像第一个字符的地址)。它在数字上与整个地址相同string,是(&name)
,在我的比喻中是house的ROW。但它们是不同的类型,一个是char*
类型,另一个是char**
类型。
基本上当C编译器看到表达式时会发生什么
char *name = "xxxxx";
是,它会说。 嘿"xxxxx"
是一个常量字符串(这是一个以0
字节结尾的字节数组),并将其放入生成的程序二进制文件中。 然后它会将字符串替换为内存位置,类似于:
char * name = _some_secret_name_the_compiler_only_know;
其中_some_secret_name_the_compiler_only_know
是指向程序执行后字符串将存在的内存位置的指针。 并加入解析文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.