两种写法都是不正确(不标准)的写法。 前者的标准写法: const char *pt = "hello world!"; 这种写法字符串被存储在静态存储区,整个程序内都可以使用,因为是 const, 所以不能修改。 后者的标准写法: char pt[] = "hello world!"; 这个字符串会在运行时在栈上分配空间,超出作用域内存即被释放,可以修改,长度取决于后面的字符串(编译时计算)。 回应 @小_秦 的质疑: 你可以在任何现代的编译器上编译你写的下面这行代码: char *p = "Hello World!"; 并开启编译器的所有警告,你会收到这样的警告(我的编译器是 Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn)): warning: conversion from string literal to 'char *' is deprecated [-Wc++11-compat-deprecated-writable-strings] 解决这个警告的办法就是如我前面所说,把 char * 改成 const char *. 我上面用的是 C++ (我看你用的也是 C++),在 C 语言里可能不会出现这个警告,但因为字符串字面量存储在静态存储区,该地址被整个程序的所有相同字符串字面量共享,所以 pt 从语义上必须是只读的,即必须 const. 关于我说的「整个程序内都可以使用」是指 pt 所指向的内存地址(你可以将这个地址保存在一个全局变量里,当你离开了这个函数,你依然可以使用),而不是 pt 这个符号。
两种写法都是不正确(不标准)的写法。
前者的标准写法:
这种写法字符串被存储在静态存储区,整个程序内都可以使用,因为是 const, 所以不能修改。
后者的标准写法:
这个字符串会在运行时在栈上分配空间,超出作用域内存即被释放,可以修改,长度取决于后面的字符串(编译时计算)。
回应 @小_秦 的质疑:
你可以在任何现代的编译器上编译你写的下面这行代码:
并开启编译器的所有警告,你会收到这样的警告(我的编译器是
Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn)
):解决这个警告的办法就是如我前面所说,把
char *
改成const char *
. 我上面用的是 C++ (我看你用的也是 C++),在 C 语言里可能不会出现这个警告,但因为字符串字面量存储在静态存储区,该地址被整个程序的所有相同字符串字面量共享,所以 pt 从语义上必须是只读的,即必须 const.关于我说的「整个程序内都可以使用」是指 pt 所指向的内存地址(你可以将这个地址保存在一个全局变量里,当你离开了这个函数,你依然可以使用),而不是 pt 这个符号。