解读char *arr=“hello“;与char arr[ ]=“hello“;

首先我们对以下字符串拷贝做一个分析:

char *st="how are you";

1). char a[11];strcpy(a,st);//这个strcpy时st+'\0'为12个字符,拷贝到a会段错误

2). char a[11];strcpy(++a,st);//a是一个首元素地址,++有赋值操作,不能对a使用

3). char a[11],*p;strcpy(p=a+1,&st[4])//strcpy(p, &st[4]);//strcpy 的第一个参数应该是一个字符数组或足够大的内存块的指针,而不仅仅是某个位置(如 p 所指向的)。虽然在这个特定情况下 p 指向了 a 数组的有效部分,但直接使用 &st[4] 作为 strcpy 的源地址是不标准的,因为 strcpy 期望一个以空字符 \0 结尾的字符串的地址,而 &st[4] 只是一个字符的地址,虽然能拷贝成功,但不建议这么使用

4). char a[ ],*p;strcpy(p=&a[1],st+2);//char a[ ]初识化不标准错误

在分析以上四种拷贝方式时,我们会引入char *arr="hello";与char arr[ ]="hello";

分析:char arr[ ]="hello";中"hello"在栈区。

        char *arr="hello";中"hello" 是字符串字面量,存储在静态区的只读区域,以字符数组形式存在,而arr字符串数组是在栈区或全局/静态区中分配的。

        在初始化过程中,arr变量定义时,编译器会生成代码将字符串字面量"hello"的内容复制到arr指向的内存位置(只复制内容),arr相当于一个副本,一个只读,一个可写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值