关于C:char a [] =“string”之间的区别; char * p =“string”;


Difference between char a[]=“string”; char *p=“string”;

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicates:
What is the difference between char s[] and char *s in C?

char a[]="string";char *p="string";有什么区别?


第一个是数组,另一个是指针。

数组声明"char a[6];要求留出6个字符的空间,以"a.的名称来表示,即有一个名为"a的位置,可以容纳6个字符。另一方面,指针声明"char *p;请求存放指针的位置。指针的名称为"p,",可以指向任意位置的任何char(或连续的char数组)。

陈述

1
2
char a[] ="hello";
char *p ="world";

会产生这样的数据结构:

1
2
3
4
5
6
   +---+---+---+---+---+---+
a: | h | e | l | l | o |\0 |
   +---+---+---+---+---+---+
   +-----+     +---+---+---+---+---+---+
p: |  *======> | w | o | r | l | d |\0 |
   +-----+     +---+---+---+---+---+---+

重要的是要认识到,像x[3]这样的引用根据x是数组还是指针生成不同的代码。给定上面的声明,当编译器看到表达式A[3]时,它会发出代码从位置"A"开始,移动三个字符,并从中提取字符。当它看到表达式p[3]时,它发出代码从位置"p"开始,在那里获取指针值,在指针上添加三个,最后获取指向的字符。在上面的示例中,a[3]和p[3]恰好是字符"l",但编译器得到的结果不同。

你可以使用搜索,在互联网上有很多关于这个主题的解释。


char a[]="string";//a是一个字符数组。

char *p="string";//p是具有静态分配的字符串文字。任何修改p内容的尝试都会导致未定义的行为,因为字符串文本存储在内存的只读部分。


没有区别。除非你真的想写数组,在这种情况下,如果你尝试使用第二种形式,整个世界都会爆炸。请看这里。


第一个声明声明声明数组,第二个声明声明声明指针。

如果您对某些特定方面的差异感兴趣,请澄清您的问题。


一个区别是,sizeof(a)-1将在编译时替换为字符串的长度。使用p时,需要使用strlen(p)来获取运行时的长度。还有一些编译器不喜欢char*p="string",它们需要const char*p="string",在这种情况下,"string"的内存是只读的,而a的内存不是。即使编译器不需要const声明,修改p(即*p='a')指向的字符串也是一种糟糕的做法。指针P可以更改为指向其他对象。对于数组A,必须将新值复制到数组中(如果适合的话)。