Difference between char *str = “…” and char str[N] = “…”?
Possible Duplicate:
What is the difference between char s[] and char *s in C?
Question about pointers and strings in C
我在读C中的弦乐,我很困惑。我可以用两种方式"声明"字符串:
1 2 | char *str ="This is string"; char str2[20] ="This is string"; |
这两个声明有什么区别?什么时候会优先选择
在C语言中,字符串表示为
除此之外,您实际上还在示例中分配字符串,这也涉及到在编译时给定的字符串。
所以有两个问题。第一个问题是如何表示字符串(
举个例子:
第一个在程序的文本中创建一个常量字符串,并创建一个指向它的指针。根据编译器的不同,它可以存储在任何地方。它相当于
第二个创建一个char数组(一种表示字符串的方法)。数组在函数执行期间存储并分配在堆栈上,您可以更改内容。因为它不是指针,所以不能将其更改为指向其他字符串。
1 | char *str ="This is string"; |
将字符串放入程序的
1 | char str2[20] ="This is string"; |
在这种类型的声明中,如果在
因此,如果您有必要修改数据,那么使用第二种方法。
1 2 | str[0] = 'a'; //This will leads to crash, because strings are in read only segment. printf("%d",sizeof(str)); //This will print 4(in 32bit m/c) or 8(in 64 bit m/c) |
1 2 | str2[0] = 'a'; //This will change the first character to a printf("%d",sizeof(str2)); //This will print 20 |
C字符串在内存中是常量,因此:
1 | char *str ="This is string"; |
将"this is string"存储在内存中,它不是可变的,您只能将另一个地址分配给str。
然而
1 | char str2[20] ="This si string"; |
是
1 | char String2[20]={'T','h','i','s',' ','s','i',' ','s','t','r','i','n','g','\0'}; |
它不在内存中存储字符串,而是存储独立的字节。
如果要使用像消息这样的常量字符串,请使用第一行。如果您想像在字处理器中那样使用和操作字符串,请使用second。
当做
C没有字符串。所有这些都是
最简单的方法实际上是你的第一个变体。如果不为文本指定数组的显式长度,将避免意外地执行类似的操作
1 | char[3] ="abc"; |