C語言初級指標

2021-09-02 00:16:06 字數 3543 閱讀 4091

#include #include int main() ;

printf("%d\n", sizeof(a)); // 求整個陣列的位元組數,4*4 = 16

printf("%d\n", sizeof(a + 0)); // 此時陣列名隱式退化成指標,在32位作業系統下是答案是4

printf("%d\n", sizeof(*a)); // 取到了整數1,答案是4

printf("%d\n", sizeof(a + 1)); // 也是指標,答案是4

printf("%d\n", sizeof(a[1])); // 整數2, 答案是4

printf("%d\n", sizeof(&a)); // 陣列指標,凡是指標都是4個位元組

printf("%d\n", sizeof(*&a)); // *和&是相反的操作,取到了整個陣列元素,16個位元組

printf("%d\n", sizeof(&a + 1)); // 陣列指標,4個位元組

printf("%d\n", sizeof(&a[0])); // 此時是乙個int*,4個位元組

system("pause");

return 0;

}

①我們可以看到 a 是乙個 int* 型別的陣列,而陣列名是不能和整數進行相加減的,一旦進行相加減則會隱式退化成指標,這個指標指向陣列首元素的位址。凡是指標在32位系統下都是 4 個位元組(本篇預設是 32 位作業系統,在 64 位作業系統下指標則是 8 個位元組)。

②而 *a 這個操作呢是先取到了乙個陣列名,而陣列名也是不能解引用的( * 是解引用操作符,是針對陣列的,相當於獲取到指標所指向的具體內容),一旦進行解引用操作,這裡的陣列名也會隱式退化成指標,指向陣列首元素即得到了數字1的位址,然後解引用便得到了數字1,而數字1是個int型別,所以是4個位元組。

③a 操作呢想必大家都很熟悉,根據索引取相應位置的元素,因為此時的陣列是個int型別,所以 a 操作所得到的結果都是4個位元組。

⑤比較難理解的就是 *&a 了,這裡先對a取位址得到了乙個陣列指標,再對陣列指標解引用,得到了整個陣列元素。

⑥最後的那個 &a[0] 操作呢是先取到了0號元素是數字1,然後對數字1取位址是個int*,也就是指標,所以是4個位元組,不過這個int*和陣列指標雖說都是指標,但是是不同型別的指標,大家要加以區分。

#include #include int main() ;

printf("%d\n", sizeof(a)); // 求整個陣列的位元組數,6

printf("%d\n", sizeof(a + 0)); // 此時陣列名隱式退化成指標,在32位作業系統下是答案是4

printf("%d\n", sizeof(*a)); // 取到了字元a,答案是1

printf("%d\n", sizeof(a[1])); // 字元b, 答案是1

printf("%d\n", sizeof(&a)); // 陣列指標,凡是指標都是4個位元組

printf("%d\n", sizeof(&a + 1)); // 陣列指標,4個位元組

printf("%d\n", sizeof(&a[0] + 1)); // 此時是乙個char*,4個位元組

printf("%d\n", strlen(a)); // 未定義行為

printf("%d\n", strlen(a + 0)); // 未定義行為

printf("%d\n", strlen(*a)); // 編譯出錯,原因是*a得到的是乙個char型別,而strlen的引數時乙個char*,型別不匹配

printf("%d\n", strlen(a[1])); // 編譯出錯

printf("%d\n", strlen(&a)); // 編譯出錯

printf("%d\n", strlen(&a + 1)); // 未定義行為

printf("%d\n", strlen(&a[0] + 1)); // 未定義行為

system("pause");

return 0;

}

①這裡先講一下字元陣列和字串的區別,首先在c語言中字串(簡稱c風格字串)確實是以字元陣列的形式進行表示的,而且這個字元陣列要以 '\0' 為結束標誌,但是這樣並不代表所有的字元陣列都是字串吧。上面這道題很顯然是個字元陣列,但是並不是字串,所以它沒有 '\0' 這個標記。

②接著再講一下 strlen 這個函式,strlen 是針對c風格字串求字串長度的函式,所以strlen(a)和strlen(a + 0)都是未定義行為,因為編譯器根本就找不到 '\0' 標記,找著找著陣列下標就越界了,所以就成了未定義行為。

③strlen它的函式宣告是這樣的:size_t__cdecl strllen (const char*) ,這裡我們可以看到引數 const char* 是個char*型別的指標吧,所以我們不難理解為什麼上述的好多strlen操作都是編譯出錯,是因為型別不匹配。

#include #include int main()
①這裡的 a 裡的元素就是個字串了。可能很多朋友對strlen和sizeof這兩個操作還是有點困惑的,那麼就先講一下這兩個的區別。我們前面說了strlen是針對字串求長度的,我們又知道字串是以 '\0' 為結尾標誌的,那麼既然是在求長度也就是元素個數,'\0' 就不會算在長度裡面了。再說sizeof是在計算位元組數,注意是位元組數,那麼計算位元組數也就是說占有的記憶體空間,這樣的話我們想一下這個操作勢必要把 '\0' 計算在內了。

②前面的sizeof和上面的題目差別不大,大家可以仔細研究。

③strlen(*a)和strlen(a[1])這兩個操作是取到了字元a和字元b,所以是型別不匹配,編譯出錯。

④要注意的是這裡的strlen(&a)這兒是個陣列指標,指向陣列首元素,往後依次找 '\0' 很容易得到字串的長度是6,所以答案就是6。

⑤而 strlen(&a + 1) 陣列指標加1操作指向了陣列的外面,所以是未定義行為。

#include #include int main()
①很顯然這裡的 p 是個 char* 型別的指標,而前面的那三個都是陣列,大家注意區分。

②p 本來就是個指標,對指標進行加減整數的操作就會使指標跳過乙個當前所指向的元素,說到底還是個指標,所以仍然是4個位元組。

③&p 這次得到的已經是個二級指標了,不過二級指標加減整數也是個二級指標,也是4個位元組。

④sizeof(&p[0] + 1) 說先取到了p[0]是字元a,對字元a取位址是指向字元a的指標,然後指標向後移一位,是指向字元b的指標,凡是指標則一定是4個位元組。若是strlen的話那往後數5個就找到了結束標記。

⑤*p, p[0] 都是取到了乙個字元,型別不匹配導致編譯報錯。

⑥要注意的是這裡的&p是個二級指標,而二級指標也是和char*型別不配,但是這裡我們要和上述那個題目的&a陣列指標要加以區分。

⑦&p +1 也還是指向了陣列外部,未定義行為。

當然關於指標的用法還有很多,這裡只是鳳毛麟角,關於指標我們要深究的還有很多。但是通過這篇部落格相信大家也是可以了解很多指標的比較不容易理解的用法的,對於 strlen 和 sizeof ,還有字串以及字元陣列要加以區分。

c語言指標初級

指標其實就是乙個變數,只不過它和普通變數有所不同,我們知道變數是用來存值的,指標也不例外,只不過它存的值是乙個位址,即就是用來標記某塊記憶體的位置。首先我們定義乙個指標 基型別 指標變數名 int i 0 int p i 這裡我們定義了乙個int 型別的指標,我們用該指標變數儲存乙個整型資料的位址 ...

C初級 指標

2.2.指標定義和使用方式 3.拓展知識 4.例項 遞迴就是一層層的進行計算 例如 求 123 n 的值 int fun int n 2.1.記憶體位址和指標 2.1.2 指標說明 2.2.指標定義和使用方式 2.2.1 指標定義格式 int p 表示定義了乙個名為p的短整型指標變數2.2.2 針涉...

c語言初級

個人是乙個菜鳥,受到影響,來一篇c語言基礎 眾所周知,c語言在如今的社會,對一些工程是很有幫助的,在下哪,雖然是個土八路,就是那種自己學的,我發現這種東西必須深入下去,你才會有飯吃,學習一門技術難度係數是很大的,這不是吹牛,我哪,最喜歡的不是別的,而是專注,我以前不知道,所以學的雜亂無章,現在我覺得...