首页 > 指向字符串的指针的定义问题

指向字符串的指针的定义问题

char* pt = "hello world!";

char *pt[] = "hello world!";
这两个有什么区别


思考良久后, 才明白 @王子亭 所描述的内容.
一直在c的门外徘徊, 经过这次讨论,对 const 又多了一些认识.

我写的例子c的代码, 非c++, 所以编译的时候没警告.


两种写法都是不正确(不标准)的写法。

前者的标准写法:

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 这个符号。

【热门文章】
【热门文章】