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...