C 語言的指標 陣列和字串

2021-10-03 07:43:57 字數 2074 閱讀 8060

c 語言中單論指標是比較簡單的,但是和陣列,字串放在一起就會令人困惑

但其實 c 語言的一致性幾乎是程式語言中最好的,對這些語法困惑的原因是沒理解語法背後的實質

很多人都認為陣列名是陣列首元素的位址,大學裡很多老師也是這麼教的

這種說法是很滑稽的,陣列名就是乙個符號,代表陣列而已

a[1]

=1;// 這裡陣列名代表陣列首元素位址嗎?

int arr[5]

;printf

("%d"

,sizeof

(arr));

// 輸出 20,是指標的大小嗎?

提出這種說法的人大概是為了解釋 「陣列可以做很多指標操作」,但又總不能直接說 「陣列就是指標」 吧

實質是什麼呢?陣列就是陣列,指標就是指標,沒什麼關係,順便說一句,是指標操作符

pointer[1]等價於*(pointer + 1)

而陣列為什麼也能用操作符呢?

當某個地方需要乙個值的時候,你寫上了陣列,但陣列又不能運算,於是編譯器就用陣列首元素位址去運算了

使用操作符時便是這種情況,因此,你一直認為的陣列操作實際上是指標操作,陣列是由於這種特殊的機制而能使用

字串是儲存在連續記憶體空間的以 『\0』 結尾的字串行

因此可以用陣列儲存字串

char str=

"hello world"

;

訪問字串使用首個字元的位址

printf

("%d"

, str[1]

);// 相當於

printf

("%d",*

(str +1)

);

字串字面量是用一對雙引號括起來的字串行

"hello world"
當多個字串字面量相鄰時,編譯器會把它們合併成乙個字串

printf

("hello"

" world"

);

編譯器會將字串字面量看作char *型別的值,printf() 函式的第乙個引數就是乙個char *型別的指標

printf

("hello world"

);

由於字串字面量被看作char *型別的位址,因此可以有下面的操作

char

*p =

"abc"

;

char ch;

ch =

"abc"[1

];

char

digit_to_hex_char

(int digit)

字串字面量是儲存在常量區的,因此試圖改變字串字面量會導致未定義的行為,通常會使程式崩潰

char

*p =

"abc"

;*p =

"def"

;// 會使程式崩潰

上面說的 「編譯器會將字串字面量看作char *型別的值」,其值就是在常量區的該字串的首字元的位址

最後還有一點要說的,你有沒有感覺什麼不太對?

char str=

"hello world"

;

既然"hello world"char*型別,為什麼還可以賦值給char型別啊?

其實這裡的"hello world"並不是字串字面量,只是乙個語法糖,等價於

char str=

;

C語言 指標 指標 陣列 字串

位址 在c語言中定義的每乙個變數都擁有屬於自己的儲存單元的位址,通常我們認為乙個變數擁有兩個值,乙個左值 位址 乙個右值 變數的值 在scanf 中使用到的 取位址符 就是向這個位址中輸入資料從而給變數賦值 訪問位址 就需要用到指標,用於儲存位址 對於物件的訪問 1.直接訪問 通過物件名去實現訪問,...

C 字元 字串 字元陣列 字串指標 指標陣列

一 c 字元 字串 字元陣列 字串指標 指標陣列 前言 一 字元指標 字元陣列 二 字串指標 三 字串 指標陣列 四 常用方法 參考為了深入理解c 並時常回顧學過的知識點,對c 知識點進行記錄總結。參考1字元指標的儲存方式 字元指標變數本身是乙個變數,用於存放字元 字串的首位址。字串本身是存放在以該...

C語言,字串的處理,陣列字串,指標字串。

c語言菜鳥教程 void memset void str,int c,size t n 複製字元 c 乙個無符號字元 到引數 str 所指向的字串的前 n 個字元。size t strlen const char str 計算字串 str 的長度,直到空結束字元,但不包括空結束字元。char str...