char* 和 char[] 的区别

char* 和 char[] 的区别

本文链接:https://blog.csdn.net/yangbodong22011/article/details/79606273

一、代码

有关下面代码,p和q的区别是什么:

int main(int argc, char *argv[])
{
    char* p = "Hello World";
    char q[] = "Hello World";
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

二、区别和解释

p和q的区别是:

p 是一个指针,指向程序 只读数据段 的”Hello World”,不可以通过p[x] = x 来赋值,因为不能改变只读数据段的内容。
q 是数组名,也是一个指针,指向栈上从 只读数据段 拷贝来的 “Hello World”

从上面的描述,可以看到,q相对于p是多了一次拷贝的,具体也可以参考[1],[2],最好的方式是汇编gcc -s hello.c -o hello.s汇编代码之后看看(如果需要汇编代码和c对比阅读,可以使用gcc参数,gcc -c -g -Wa,-adlhn hello.c > hello.s,如果需要Inter风格,可以 -masm=intel):

这里写图片描述

可以看到第一次指令:movq $.LC0, -8(%rbp) 直接把存在.LC0的只读数据”Hello World”保存在了寄存器rbp中。
第二次有两个指令,分别是movabsq $8022916924116329800, %raxmovq %rax, -32(%rbp)第一句是吧Hello World[3]移动到了rax中,然后把rax的内容移动到了rbp栈基址寄存器中,也就是前面说的多了一次拷贝,这个操作相当于复制。

三、结论

对于程序中不需要修改的常量字符串,定义成char *而不是char[],可以提升程序的效率,毕竟少一次拷贝,这种情况常见于日志输出的时候。char *init = "init success"char *p = "startup fail"等等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值