数组字符串和指针字符串

在C语言中,表示一个字符串我们可以用数组如char str[] = "abc",也可以用指针char *str = "abc",那二者有何区别呢?

 

1、数组字符串存放在全局数据区或栈区,可读可写;指针字符串存放在常量区,可读不可写。

数组字符串:
char str[] = "abcd";
puts(str);       // 可读
str[0] = 'm';    // 可写

指针字符串:
char *str = "abcd";
puts(str);       // 可读
str[0] = 'm';   // 错误,不可写

 

2、字符串常量不可以直接赋值给数组名;但可以直接赋值给字符指针。

数组字符串:
char str[10];
str = "abcd";     // 错误,不可赋值。但可以用strcpy(str, "abc")来赋值。

指针字符串:
char *str;
str = "abcd";     // 正确

 

之所以产生这种现象,是因为双引号在编译过程中提供了如下功能:

(1)申请了内存空间(常量区),存放字符串;
(2)在字符串末尾加上'\0';
(3)返回一个地址;
数组str[10]和指针*str中的str都是指地址,但数组的地址是一个常量,所以不可进行赋值,即将一个值(地址,由双引号申请的地址)赋给一个常量(常量地址);但指针是一个变量,所以可以被赋值。

猜你喜欢

转载自www.cnblogs.com/programmer-home/p/12925704.html