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.一般如果需要对字符串进行更改,用数组定义;如果不对字符串进行更改,就用指针定义。