当你用char
指针创建一个字符串时,它是如何工作的?
char *name = "ben";
Run Code Online (Sandbox Code Playgroud)
这是'隐藏'指针算术吗?
没有任何隐藏的指针算术,但我怀疑你想要一个更详细的答案.
如果你有一个功能:
void foo() {
char * bar = "Hello World";
}
Run Code Online (Sandbox Code Playgroud)
实际上有两个内存块可供使用:
bar
变量.当程序调用时foo()
,它会分配足够的堆栈空间(32位为4个字节)来容纳这个内存位置,并将其初始化为实际数据的位置.出现这种情况每次你欢乐的时光foo()
.此外,如果您稍后在函数中执行这样的语句:
bar = "Good bye";
Run Code Online (Sandbox Code Playgroud)
您没有将数据"Hello World"更改为"Good bye".你实际上只是在数据段中有一个第3块内存,其中包含"Good bye"(仍然在编译时分配),然后当该行执行时指针(bar)被设置到该位置.
创建"字符串"(字符数组)的另一种方法是:
void foo() {
char bar[] = "Hello World";
}
Run Code Online (Sandbox Code Playgroud)
这是不一样的第一(近,虽然).在此方法中,除了您关注的实际数据("Hello World"+空字节)在程序堆栈上分配和初始化之外,您仍然有两个变量.
您可以通过运行gcc -S test.c
然后阅读来查看已编译程序集中的差异test.s
.
在某些时候,你会想看看C的字符串函数.
在使用这些函数时,要记住的关键是他们根本不知道你的字符数组有多长,他们根据第一个空字符的位置(一个标记值)来计算出来.