char *s = "test";
s[1] = 'E';
用 char s[] = "test" 就能使用下标了,这两种是不一样的吗?
不一样的,第一种里面“test”是字符串常量,存储在文本区,而s只是一个指针;第二种是局部变量,用来初始化s字符数组,存储在栈区
char *s = "test";
s是指向字符常量的指针,字符常量是不能改变其值的,可以使用下标访问该字符常量,但不能对其进行赋值操作
char ss[] = "test"; // 字符数组赋值的一种方式
ss是一个字符数组,可以使用下标访问并对其做赋值操作
原因:因为定义的不是数组,不能用访问数组元素[]的方式访问。
答案:可以这样访问:
++++++++++++++++++++++++++++++++++++++++++++++++++++
char *pc ="test";
const char *ps = "test";
char cArray[] = "test";
printf ("pc+1: %c\n",*(pc+1) );
printf ("ps+1: %c\n",*(ps+1) );
printf ("cArray[1]:%c\n", cArray[1]);
++++++++++++++++++++++++++++++++++++++++++++++++++++
// 以下代码在gcc版本:
// gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2)
// 编译运行Ok
// 这个跟C编译器也有关系,所以不能一概而论啊。
#include
int main(void)
{
char c;
char *pc ="test";
const char *ps = "test";
char cArray[] = "test";
printf ("pc+1: %c\n",pc[1] );
printf ("pc+1: %c\n",*(pc+1) );
printf ("ps+1: %c\n",*(ps+1) );
printf ("ps+1: %c\n",ps[1] );
printf ("cArray[1]:%c\n", cArray[1]);
printf ("cArray+1:%c\n", *(cArray+1) );
return 0;
}
// 运行结果:
pc+1: e
pc+1: e
ps+1: e
ps+1: e
cArray[1]:e
cArray+1:e
是时候放出赵老师的名言了,不要迷信书,要迷信编译器
这个[]编译器对于类似char* 这样的没办法解析地址
const char *ps = "test";
char cArray[] = "test";
第一个是指针,只能以访问地址的方式去访问 printf ("pc+1: %c\n",*(pc+1) );
第二个是数组,当然可以用下标的方式访问;
指针只是指向该字符串存储地址的开始位置。 只是一个指向地址的变量。
不一样,指针在栈里,
字符串常量不可以修改