在學習指針的時候,獲得指針的定義和數組的定義同樣,可是這時候就很好奇,指針只是一個地址,那數組和指針同樣的話,sizeof時怎麼得知其長度呢。數組
因而百度了下面的回覆:函數
千萬不要把數組名當作指針,儘管有些時候他們是相通的,但也僅限某些時候而已。
sizeof是一個奇特的函數,告訴你你也許不相信——sizeof在編譯的時候就已經肯定sizeof的結果了,這有點相似於宏。
學習
char str[] = 「Hello」 ; sizeof ( str );//輸出爲6
編譯器編譯的時候根據上下文徹底知道str是一個數組,sizeof (str ) = 6 理所固然是在求數組所佔字節數,這個字節數在編譯期間就能夠肯定(數組的大小必須在編譯前指定好,C語言規定)
spa
void *p = malloc( 100 ); sizeof ( p );//輸出爲4
編譯器看到p是個指針,但是誰能保證指針所指內存的大小呢?儘管你這裏寫着100,可是malloc但是動態分配,沒人敢保證malloc必定返回100個字節,甚至好比你不調用malloc,調用一個本身寫的函數,編譯器總之是沒法在編譯期間就肯定指針所指內存大小的,而sizeof又必須在編譯期間知道結果,那好,sizeof只好返回指針自己所佔內存的大小,32位機上是4個字節,64位機上是8個字節。
指針
void Func ( char str[100]) { sizeof( str ); //輸出爲4 }
數組做爲參數時,編譯器在編譯期間一概編譯爲指針,這樣儘管你定義str爲數組,實際上在編譯器眼裏後等同於:code
void Func ( char * str) { sizeof( str );//輸出爲4 }
數組做爲參數時,一概被編譯器編譯爲指針。blog