繁体   English   中英

指向字符串的指针

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM