數(shù)組名的蛻化
數(shù)組在作為函數(shù)參數(shù)時,數(shù)組名將蛻化為指針。書上為什么這么說呢?書上的意思是說這家伙已經(jīng)蛻化得不知道自己有幾個元素了。舉個例子:
void fun(char array[5]);
在編譯時編譯器會當成是:void fun(char *array);你在這個函數(shù)中使用sizeof(a)得到的值是4,而在定義char array[5]的函數(shù)中sizeof(array) = 5,說明確實已經(jīng)蛻化為指針了。所以你寫:
char *pa = array ; //正確,指針到指針
數(shù)組名退化為指針,在這里強調(diào)一下:數(shù)組的元素類型仍然存在!這里要注意的是多維數(shù)組的情況。
以2維數(shù)組為例:
void fun2(char arrayMulti[3][5]);
那么在函數(shù)fun2中,arrayMulti蛻化成的是char (*)[5],即:指向char[5]類型的指針,因為前面分析過arrayMulti的元素的類型是char[5],所以在程序中:
char **pm = arrayMulti ; //錯誤:從char (*)[5]到 char **的賦值
char (*pm5)[5] ;
pm5 = arrayMulti ; //正確。
>> 數(shù)組在作為函數(shù)參數(shù)時,數(shù)組名將蛻化為指針。書上為什么這么說呢?書上的意思是說這家伙已經(jīng)蛻化得不知道自己有幾個元素了。
很形象,也抓住了重點。
其實根據(jù)標準的規(guī)定,不僅僅是數(shù)組在作為函數(shù)參數(shù)時數(shù)組名將退化為指針——除了作為sizeof和&的操作數(shù)之外,在表達式中出現(xiàn)的數(shù)組名都不知道自己有幾個元素,所以這時它的類型已經(jīng)不再是數(shù)組類型了,而是decay為一個指針。
舉例說明:
int a[10]; // 定義 a 的類型為 int[10],數(shù)組類型
int* p = a; // a 的類型為 int*,指針類型,不再是數(shù)組類型。
a[0] = 0; // a 的類型為 int*,指針類型,不再是數(shù)組類型。并且 a[0] = *(a+0) = *a。
sizeof( a ); // a 的類型為 int[10],數(shù)組類型。
p = &a; // a 的類型為 int[10],數(shù)組類型。因此,&a 的類型為int (*)[10],是指針類型,但是跟 p 的指針類型(int*)不匹配,因此賦值非法。
總之,只要排除了sizeof和&這兩種情況,在程序中把數(shù)組名作為指針來使用就是了,而且是一個指向數(shù)組首元素的指針(即數(shù)組名代表的值就是數(shù)組第一個元素的地址)。