char *array和char array[]

idfiyjo8  于 2023-03-22  发布在  其他
关注(0)|答案(4)|浏览(177)

如果我写这个

char *array = "One good thing about music";

我真的创建了一个数组?我的意思是它和这个一样?

char array[] = {"One", "good", "thing", "about", "music"};
bd1hkmkf

bd1hkmkf1#

声明和初始化

char *array = "One good thing about music";

声明一个指针array,并使其指向一个27个字符的(只读)数组,包括终止空字符。
声明和初始化

char array[] = "One, good, thing, about, music";

声明一个字符数组,包含31个字符。
是的,数组的大小是31,因为它包括终止字符'\0'
在内存中,它将是这样的第一个:

+-------+     +------------------------------+
| array | --> | "One good thing about music" |
+-------+     +------------------------------+

第二个是这样的:

+------------------------------+
| "One good thing about music" |
+------------------------------+

数组衰减为指向数组第一个元素的指针。

char array[] = "One, good, thing, about, music";

那么当需要一个指针时使用普通的array,它和&array[0]是一样的。
这意味着,当你,例如,将数组作为参数传递给函数时,它将作为指针传递。
指针和数组 * 几乎 * 是可以互换的。例如,你不能使用sizeof(pointer),因为它返回的是实际指针的大小,而不是它指向的内容。另外,当你使用&pointer时,你会得到指针的地址,但是&array返回一个指向数组的指针。应该注意的是,&arrayarray非常不同(或其等价物&array[0])。虽然&array&array[0]指向相同的位置,但类型不同。使用上面的数组,&array的类型为char (*)[31],而&array[0]的类型为char *
更多乐趣:正如很多人所知,在访问指针时可以使用数组索引。但是因为数组衰减为指针,所以可以对数组使用一些指针算法。
例如:

char array[] = "Foobar";  /* Declare an array of 7 characters */

使用上面的代码,您可以使用以下任一方法访问第四个元素('b '字符

array[3]

*(array + 3)

因为加法是commutative,所以最后一个也可以表示为

*(3 + array)

这就引出了有趣的语法

3[array]
eeq64g8w

eeq64g8w2#

不,你是在创建一个数组,但有一个很大的区别:

char *string = "Some CONSTANT string";
printf("%c\n", string[1]);//prints o
string[1] = 'v';//INVALID!!

数组是在内存的“只读”部分创建的,因此不能通过指针编辑值,而:

char string[] = "Some string";

创建相同的只读常量字符串,并将其 * 复制 * 到堆栈数组。这就是原因:

string[1] = 'v';

在后一种情况下是有效的。
如果你写:

char string[] = {"some", " string"};

编译器应该会抱怨,因为你正在构造一个char数组(或char指针)的数组,并将其赋值给一个char数组。这些类型不匹配。要么写:

char string[] = {'s','o','m', 'e', ' ', 's', 't','r','i','n','g', '\0'};
//this is a bit silly, because it's the same as char string[] = "some string";
//or
char *string[] = {"some", " string"};//array of pointers to CONSTANT strings
//or
char string[][10] = {"some", " string"};

最后一个版本给了你一个字符串数组(字符数组),你实际上可以编辑……

uqzxnwby

uqzxnwby3#

不,事实上,它和

char array[] = {'O', 'n', 'e', ..... 'i','c','\0');

每个字符都是一个单独的元素,并有一个额外的\0字符作为字符串结束符。
我引用了“相同”,因为char * arraychar array[]之间存在一些差异。如果您想了解更多信息,请查看C: differences between char pointer and array

rjjhvcjd

rjjhvcjd4#

它非常类似于

char array[] = {'O', 'n', 'e', ' ', /*etc*/ ' ', 'm', 'u', 's', 'i', 'c', '\0'};

但给你只读存储器。
有关char[]char *之间的差异的讨论,请参见comp.lang.c FAQ 1.32

相关问题