为什么用 char *s = "test" 定义的 C语言字符串不能使用下标?

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) );
第二个是数组,当然可以用下标的方式访问;

指针只是指向该字符串存储地址的开始位置。 只是一个指向地址的变量。

学习学习。图片说明

不一样,指针在栈里,

字符串常量不可以修改