可能是重复问题:
C语言中“char var[]”和“char *var”有什么区别?
char a[]=“string”; char *p=“string”;的区别是什么?
请问有人能够解释一下char[]和char*之间的确切区别吗? 例如:
char name[] = "earth";
并且
char *name = "earth";
谢谢
可能是重复问题:
C语言中“char var[]”和“char *var”有什么区别?
char a[]=“string”; char *p=“string”;的区别是什么?
请问有人能够解释一下char[]和char*之间的确切区别吗? 例如:
char name[] = "earth";
并且
char *name = "earth";
谢谢
char namea[] = "earth";
char *pname = "earth";
其中一个是数组(名称namea
指的是一块字符块)。
另一个是指向单个字符的指针(名称pname
指的是指针,它恰好指向一块字符块的第一个字符)。
虽然前者经常会转化为后者,但并非总是如此。尝试对它们进行sizeof
操作,看看我是什么意思。
数组的大小就是数组的大小(包括终止的空字符在内,共六个字符)。
指针的大小取决于指针宽度(4或8等)。pname
指向的大小不是数组,而是第一个字符。因此大小为1。
您还可以使用pname++
之类的方法来移动指针(除非它们被声明为常量,例如char *const pname = ...;
)。您不能将数组名称移动到其第二个字符(namea++;
)。
char *name = "earth"
已经过时。应该改为 const char *name = "earth"
。此外,需要强调的是,任何方式修改字符串字面值都会导致未定义行为。 - Alok Save(1) char name[] = "earth";
name
是一个字符数组,其内容为'e'
,'a'
,'r'
,'t'
,'h'
,0
。这些字符的存储位置取决于 name[]
的声明位置(通常是堆栈或数据段)。
(2) char *name = "earth";
name
是一个指向常量字符串的指针。存储"earth"
的位置在只读内存区域中。
在C++中,这已经过时了,应该使用const char *name = "earth";
char name[] = "earth";
在堆栈上创建一个可变数组,大小为6,值为earth\0
。char* name = "earth";
定义一个指向字符串常量的指针,其值为earth\0
。使用
char *name = "earth"
你不能修改名称的内容。
因此
name[2] = 'A';
char* 以 '\0' 字符结尾,而 name[] 具有固定大小。
会导致段错误。
初始化变量会对数组产生巨大的性能和空间惩罚。只有在打算更改字符串时才使用数组方法,它占用堆栈空间并且每次进入变量作用域都会增加一些严重的开销。否则请使用指针方法。
char[]
描述了一个具有固定元素数量的 char 数组。
char*
描述了一个指向 char 的指针,通常在内存中跟随一系列 char,通常以空字符 \0
结尾。
name++
,你会看到不同之处。还有sizeof(name)
。 - paxdiablo