const char *string1;
const char string2[];
1 可以不用const,例如:
char aa[] = "abc";
aa[0] = 'd';
printf("%s\n", aa); //这里打印的结果是dbc,aa的大小是4,abc+一个\0
2 const char *aa = "abc";
aa[0] = 'd'; //这个时候是错误的,因为aa是一个指针,指向一个字面常量“abc”,这个字面常量是保存在程序的全局静态数据区,不可更改,默认就是const的,所以char *aa = "abc";是错误的。
3 const char aa[] = "abc";
aa[0] = 'd'; //这里也会报错,因为是const的aa指向的值不可更改。
const char *aa = "abc";
aa = "bcd"; //正确,const 类型 * ptr = value,这样的指针,指向的值不可变,但是指针本身可以重新指向其他地方。
4 怎么才能更改const char aa[] = "abc";中“abc”的值呢?这个时候aa指向的内存在程序的全局内存上(aa是在全局变量)或者在栈内存上(aa是局部变量),非全局静态数据区,所以我们可以强制转换:
const char aa[] = "abc";//但是const char *aa = "abc";这种情况不行,语法没有问题,运行报错,操作系统应该会对静态数据区做保护。
printf("%s %d\n", aa, sizeof(aa));
int bb = (int)aa;
char *ptr = (char*)bb;
ptr[0] = 'd';
printf("%s\n", aa);
char aa[] = "abc";
aa[0] = 'd';
printf("%s\n", aa); //这里打印的结果是dbc,aa的大小是4,abc+一个\0
2 const char *aa = "abc";
aa[0] = 'd'; //这个时候是错误的,因为aa是一个指针,指向一个字面常量“abc”,这个字面常量是保存在程序的全局静态数据区,不可更改,默认就是const的,所以char *aa = "abc";是错误的。
3 const char aa[] = "abc";
aa[0] = 'd'; //这里也会报错,因为是const的aa指向的值不可更改。
const char *aa = "abc";
aa = "bcd"; //正确,const 类型 * ptr = value,这样的指针,指向的值不可变,但是指针本身可以重新指向其他地方。
4 怎么才能更改const char aa[] = "abc";中“abc”的值呢?这个时候aa指向的内存在程序的全局内存上(aa是在全局变量)或者在栈内存上(aa是局部变量),非全局静态数据区,所以我们可以强制转换:
const char aa[] = "abc";//但是const char *aa = "abc";这种情况不行,语法没有问题,运行报错,操作系统应该会对静态数据区做保护。
printf("%s %d\n", aa, sizeof(aa));
int bb = (int)aa;
char *ptr = (char*)bb;
ptr[0] = 'd';
printf("%s\n", aa);
温馨提示:答案为网友推荐,仅供参考
第1个回答 2019-02-13
避免后面被修改呗。更安全。