声明和初始化
char *array = "One good thing about music";
声明一个指针array,并使其指向一个31个字符的常量数组。
声明和初始化
char array[] = "One, good, thing, about, music";
声明一个字符数组,包含 31 个字符。
是的,数组的大小是 31,因为它包括终止符 '\0'。
放在内存中,第一次是这样的:
+--------+ +-----------------+
|数组 | --> | “关于音乐的一件好事” |
+--------+ +-----------------+
第二个是这样的:
+------------------------------+
| “关于音乐的一件好事” |
+------------------------------+
数组衰减为指向数组第一个元素的指针。如果你有一个像
这样的数组
char array[] = "One, good, thing, about, music";
然后在需要指针时使用普通的array,它与&array[0] 相同。
这意味着,例如,当您将数组作为参数传递给函数时,它将作为指针传递。
指针和数组几乎可以互换。例如,您不能使用sizeof(pointer),因为它返回的是实际指针的大小,而不是它指向的内容。当你这样做时,例如&pointer 你得到了指针的地址,但是&array 返回了一个指向数组的指针。应该注意的是,&array 与array(或其等效的&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]