C中的char stringA[LEN]和char*stringB[LEN]有什么区别

C中的char stringA[LEN]和char*stringB[LEN]有什么区别,c,arrays,string,pointers,C,Arrays,String,Pointers,我读了一些类似的问题,但似乎没有一个能消除我的疑虑 char* s = "Hello World!"; 我知道 char *s = "Hello world"; 使字符串不可变,而 char s[] = "Hello world"; 可以修改 我的疑问是,我是否真的做了charstringa[LEN]和字符*stringB[LEN]它们有什么不同吗?或者stringB是否又像以前一样变得不可变?它们没有相同的数据类型,更不具有可比性 charstringa[LEN]是长度为LEN的c

我读了一些类似的问题,但似乎没有一个能消除我的疑虑

char* s = "Hello World!";
我知道

char *s = "Hello world";
使字符串不可变,而

char s[] = "Hello world";
可以修改


我的疑问是,我是否真的做了
charstringa[LEN]
字符*stringB[LEN]它们有什么不同吗?或者
stringB
是否又像以前一样变得不可变?

它们没有相同的数据类型,更不具有可比性

  • charstringa[LEN]
    是长度为
    LEN
    char
    数组。(字符的数组)

  • char*stringB[LEN]
    是长度为
    LEN
    char*
    数组。(字符
    char
    指针数组)

FWIW,如果是
char*s=“Hello world”
s
是指向不可修改的字符串文字的指针。指针本身当然可以更改。只能更改它指向的内容(值)

他们有什么不同吗

是的。
变量
stringA
stringB
都是数组
stringA
是大小为
LEN
char
数组,而
stringB
是大小为
LEN
char*
数组

char
char*
是两种不同的类型
stringA
只能保存一个长度为
LEN
的字符串,而
stingB
的元素可以指向
LEN
的字符串数

还是像以前一样,
stringB
再次变得不可变

stringB
元素所指向的字符串是否可变取决于内存的分配方式。如果它们是用字符串文字初始化的

char* stringB[LEN] = { "Apple", "Bapple", "Capple"};  
那么它们是不变的。万一

for(int i = 0; i < LEN; i++)
    stringB[i] = malloc(30)  // Allocating 30 bytes for each element  

strcpy(stringB[0], "Apple");
strcpy(stringB[1], "Bapple");
strcpy(stringB[2], "Capple");  
for(int i=0;i
它们是可变的。

它们不一样

这里的
stringA
是一个
char
数组,这意味着打印
stringA[0]
将显示字母
S

char stringA[] = "Something";
而在这里打印
stringB[0]
将显示
某些内容
(指向字符的指针数组):


让我给你一个直观的解释:

如您所见,
a
是一个由4个字符组成的数组,而
b
是一个由4个字符指针组成的数组,每个指针指向C字符串的开头。这些字符串中的每一个都可以有不同的长度。

原因 是不可变的,因为
“Hello World!”
存储在RO(只读)内存中,所以当您尝试更改它时,它会抛出一个错误。将它声明为指向“数组”的第一个元素的指针并不是它不可变的原因。你似乎也有点困惑 假设你的问题正是你的意思

char* stringB[LEN] = {"ABC", "DEF"}; 假设你的意思和我想的一样

char* stringB[LEN] = {"ABC", "DEF"}; char stringA[LEN]=“你好,世界!”; char*stringB=malloc(LEN); strcpy(stringB,stringA);
在这种情况下,stringB是可变的,因为它指的是可写内存。

答案的第二部分应该包含stringB而不是StringA。区别在于数组是数组,指针是指针。指针不是数组,数组也不是指针。 char* stringB[LEN] = {"ABC", "DEF"}; char stringA[LEN] = "Hello World!"; char *stringB = malloc(LEN); strcpy(stringB, stringA);