1. 程式人生 > >神奇的C語言二:陣列名是什麼

神奇的C語言二:陣列名是什麼

對陣列名取地址得到的是什麼?看一個例子:
int a[10];
printf( "%d-%d", a, & a);

在VC++中測試結果是,輸出的兩個數相同,都是陣列在記憶體中的首地址,即 & a[0]。

猜測:這裡的&會被編譯器忽略。a在記憶體中是不存在的,記憶體中的是a[0] a[1]....a[9],上述printf列印的a在編譯的時候就被替換成了a在記憶體中的地址。因為a是概念上的,而非記憶體中的,所以自然不存在地址,也就無法對它使用取址符。但是編譯器很聰明,會忽略&。

這個猜測對嗎?

看下面的程式:

int main(){
	//queuef();
	int a[5] = { 1, 2, 3, 4, 5 };
	printf("%d,%d,%d\n", *(a + 1), *(&a + 1), a + 1);
	return 0;
}
輸出是什麼呢? 求大神解答。

類似的問題:函式名是什麼?

函式名是什麼這個真的不重要,它只是一個編譯時刻的概念,我們只需要按照正常的方式來編寫程式即可!

如果您感興趣,請繼續閱讀:

關於函式名會有很多奇葩的程式,例如:

void f(){
	printf("hello");
}
int main(){
	(***************f)();
	return 0;
}

這是一個可以編譯卻”不正常“的程式 :)

記住編譯規則就行:

一、編譯器在處理 * funcName 時返回的還是 funcName;

二、編譯器在處理 & funcName 時返回的是函式地址,一個unsigned int型別的符號常量值;

三、編譯器在處理函式指標的取值和取址時的方式和一、二相同,即 * funcPointer 仍舊返回 funcPointer,& funcPointer 返回無符號符號常量。

有了上述規則,我們就容易理解為什麼**********f是合法的,而&&&&&&&&&&f是不合法的了。

這只是編譯器的處理規則,如果以後面試遇到這種變態題,相信您也可以自如應對了。