#include<stdio.h>
void f() {
char* name = "Gerardo";
puts(name);
}
int main(void) {
char* name = "Gerardo";
puts(name);
return 0;
}
编译后的汇编代码(只留下相关部分):
.LC0:
.string "Gerardo" <----- Aparece solo una vez
.section .text.unlikely,"ax",@progbits
f:
.LFB23:
.cfi_startproc
movl $.LC0, %edi <---- Ponemos la dirección de la cadena en edi
jmp puts <---- Y puts usa la cadena desde ahí directamente
.cfi_endproc
main:
.LFB24:
.cfi_startproc
subq $8, %rsp
.cfi_def_cfa_offset 16
movl $.LC0, %edi <------- Main usa la misma cadena
call puts
一个根本的区别是,在指针的情况下,它指向一个字符串文字。试图修改它是未定义的行为。
而在另一种情况下,数组包含可修改的字符串的副本。
字符串文字不可修改的事实允许编译器进行某些优化。如果字符串在代码中重复并用作文字,则编译器可以将相同的字符串副本用于所有用途,从而减少内存使用。也可以直接使用,速度更快。
例如,这个 C 程序:
编译后的汇编代码(只留下相关部分):
但是使用数组的相同程序:
编译时:
编译我使用的那些示例
gcc -c -S -O2 fichero.c
(版本 5.4.0)结论。如果您不打算修改字符串,则分配给指针的字符串文字的替代方案更快并且使用更少的内存。如果要修改字符串,则应使用数组。
字符指针通常用于访问字符串,因为它们是建立在地址(第一个字符的地址)和字符串结束标记('\0' 字符)的基础上的。字符指针的声明遵循通常的规则:
字符串指针:定义、声明和初始化。字符串的声明可以如下:
这为一串 LENGTH 字符保留空间。
在 C 中,一维列表的名称等于列表中第一个元素的地址。一旦为字符串保留了可用空间,就可以使用以下语句构造指向该字符串的指针:
参考。
http://maxus.fis.usal.es/fichas_c.web/07xx_PAGS/0702.html
指向 char 的指针使用字符串中第一个元素的地址访问字符串,该字符串以
'\0'
(end-of-string character) 结尾。当您这样做时++
,它会前进到字符串中的下一个地址(下一个字符)。char 数组是指向字符串第一个字符的指针。因此,从它们在内存中的存储方式来看,并没有什么区别。区别在于语法,使用数组类型的语法更好,因为当使用指针语法时,编译器必须解决运算符的重载,
*
因为它也用于乘法并且在执行和编译中会影响性能。对于人眼来说,使用数组也更容易。数组的语法比指针更容易理解。