C语言中数组形式定义和指针形式定义的字符串的异同

C语言中数组形式定义和指针形式定义的字符串的异同

1. char *s=“Hello World!”;

1.s是一个指针,他指向了字符串常量,也就是这个字符串常量所在的地址
2.指针s是一个指针变量,可以被修改。
3.字符串只有一个副本,只能读,不能写,如果试图对s所指的字符串修改,将会出现错误
4.这种写法,更准确的说是 const char *s=“Hello World!”,但是编译器一般会接受没有const的写法

2.char s[]=“Hello World!”;

1.数组形式中,s是一个地址常量,不可以使用++s之类的操作(也即S的值不能改变)
2.字符串有两个副本,数组名指向的这个是拷贝到普通变量存储区的,可以随意改变,因此如果想要在后续修改字符串,则应该用数组的方式定义
3.数组名s和指针s都是地址,但是区别在于计算机对于这两个地址的分配方式不同
4.数组s是和程序里的其他普通变量(例如int i=3;)放在一起的,是本地变量

3.总之

1.初始化数组把静态存储区的字符串拷贝到数组中, 而初始化指针只把字符串的地址拷贝给指针

4.代码示例

#include <stdio.h>
#define MSG "I am special"

int main()
{
    char ar[] = MSG;
    const char *pt = MSG;

    printf("\"I am special\"的地址:%p\n", "I am special"); //这个地址代表了最原始的字符串定义在静态存储区的位置
    printf("            ar的地址:%p\n", ar);               //数组形式会重新拷贝一份,所以数组名指向的地址不在静态存储区
    printf("            pt的地址:%p\n", pt);               //指针形式,只是获得了字符串在静态存储区的地址
    printf("           MSG的地址:%p\n", MSG);              //符号常量本身具有地址属性
    
    return 0;
}
输出结果为:
"I am special"的地址:0000000000404000
            ar的地址:000000000061FE13
        	pt的地址:0000000000404000
       		MSG的地址:000000000040400

5.指针形式和数组形式的在使用时的区别

1.指针名是变量,数组名是常量
2.指针命定义之后,字符串元素是常量不可以修改;数组名定义后,数组元素是变量可以修改
3.一般如果需要对字符串进行更改,用数组定义;如果不对字符串进行更改,就用指针定义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咖啡与乌龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值