每日一c,對指標,陣列,字串常量之間的梳理(一)

2021-08-01 21:36:38 字數 3726 閱讀 9419

萬丈高樓平地而起,學好it,得把純c基礎打牢實了。最近,乘著還有空閒時間,從新梳理哈自己的純c關係樹。一邊學習一邊記錄,蠻不錯的

指標與陣列的相同與不同

一.作為函式引數時,在語句或者表示式中使用陣列時,我們可以採用陣列或者指標的任何一種形式,除此之外的其他情況,指標與陣列不能互喚.

規則總結:

1.表示式中的陣列名被編譯器當作乙個指向該陣列的第乙個元素的指標

2.下標總是和指標的偏移量相同

3.在函式引數的宣告中,陣列名被編譯器當作指向該陣列第乙個元素的指標例:

#include

int main()

;printf(" sizeof(num) = %d\n", sizeof(num) );

//注意sizeof(str)的長度應該為11,包括字串後面的'\0' 

char str = "0123456789";// 

printf(" sizeof(str) = %d\n", sizeof(str) );

//注意sizeof(str1)的長度應該為10,不包括字串後面的'\0',但是,最好將字串的最後乙個字元設定為空

char str1 = ;

printf(" sizeof(str1) = %d\n", sizeof(str1) );

//&num的型別為'int (*)[10]',表示的是乙個指向長度為10的整形陣列的指標

int (*ptoint)[10] = #

printf(" sizeof(ptoint) = %d, (*ptoint)[9] = %d\n", sizeof(ptoint), (*ptoint)[9] );

//&str的型別為'char (*)[11]',表示的是乙個指向長度為11的字元陣列的指標,注意str陣列的長度是11,而不是10

char (*ptostr)[11] = &str;

printf(" sizeof(ptostr) = %d, (*ptostr)[9] = %c\n", sizeof(ptostr), (*ptostr)[9] );

//由於p指向的是陣列num[5],所以對下標取負值後,不會超出陣列的正常取值範圍

//該例子也說明了為什麼下標檢查在c語言中是一項困難的任務:下標引用可以作用於任意的指標,而不僅僅是陣列名

//作用於指標的下標引用的有效性即依賴於該指標當時恰好指向什麼內容,也依賴於下標的值

int *p = num + 5;

printf(" p[-1] = %d, p[0] = %d, p[1] = %d \n", p[-1],p[0],p[1] );

//下面的表示式中,'num[5]和5[num]'的值是一樣的,把它們轉換成對等的間接訪問表示式,它們都等同於*(num + 2)

//'5[num]'這個古怪的表示式之所以可行,緣於c實現下標的方法。對編譯器來說,這兩種形式並無差別

//但是,決不應該編寫形如'5[num]'的表示式,因為它會大大的影響程式的可讀性

printf(" num[5] = %d, 5[num] = %d \n", num[5], 5[num] );

getchar();

return 0;}

字串常量

.

當乙個字串常量出現在表示式中時,它的值是指標常量。編譯器把該字串的乙份拷貝儲存在記憶體的某個位置,並儲存乙個指向第乙個字元的指標。我們可以對字串常量進行下標引用、間接訪問以及指標運算.

1 「xyz」+2

字串常量實際上是個指標,這個表示式計算

「指標值加上

1」的值。它的結果也是個指標,指向字串中的第二個字元z

2 *

「xyz」

對乙個指標執行間接訪問操作時,其結果就是指標所指向的內容。字串常量的型別是

「指向字元的指標」,所以這個間接訪問的結果就是它所指向的字元:

x。注意表示式的結果並不是整個字串,而只是它的第乙個字元。

3 「

xyz

[2]

同樣可以推斷出上面這個表示式的值就是字元z。

例:#include

//接受乙個無符號整型值,把它轉換成字元,並列印出來

//如果是列印16進值的數,可以用這種方法:putchar( "0123456789abcdef"[ value % 16 ] )

void binary_to_ascii( unsigned long value )

int main(void)

用字串常量初始化指標和陣列

.

定義指標時,編譯器並不會為指標所指的物件分配空間,它只是分配指標本身的空間,除非在定義的同時就賦給指標乙個字串常量進行初始化。

例:

char

*p =

breadfruit

;

注意只有對字串常量才是如此。不能指望為浮點數之類的變數分配空間,如:

float *pip = 3.14;     /*

錯誤,無法通過編譯

*/

在ansi c中,初始化指標時所建立的字串常量常被定義為唯讀。

如果試圖通過指標修改這個字串值,程式會出現未定義的行為。在有些編譯器中,字串常量被存放在只允許讀取的文字段中,以防止它被修改。

陣列也可以用字串常量進行初始化:

char a =gooseberry;

與指標相反,由字串常量初始化的陣列是可以修改的。比如下面的語句:

strncpy( a,black, 5 );

將陣列的值修改為blackberry」。

例:

#include

#include

int main(void)

字元陣列,字元指標,字串常量

一 字串可以賦值給字元指標變數 char p hello 其實這裡分配了常量,即const,如果不讓p指向別的位址就無法修改。char q world cout p q 1.字串常量 hello 出現在乙個表示式中時,hello 表示式使用的值就是這些字元所儲存的位址 在常量區 而不是這些字元本身。...

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

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

C C 字串常量 字元陣列和字元指標

通常,如果在程式中定義了乙個字串,那麼為了節省記憶體,會把相同的字串儲存到乙個單獨的 相同的位置,此時如果用多個字元指標指向它,那麼指標的值會相同。常量字串位於c c 的文字常量區,在程式結束以後由系統釋放。char p string1 example char p string2 example ...