天天看點

數組、指針、字元串

1、數組

數組元素個數必須是一個固定的值,可以是整形常量、符号常量及整形常量表達式

 數組下标可以是整形常量、整形變量或者整形表達式

 數組可以全部初始化,此時元素個數可以省略;也可部分初始化,元素個數不可省略

 數組初始化的指派方式隻能用于數組的定義,定義之後再指派隻能一個一個元素指派
           

2、記憶體位址

計算機記憶體是以位元組為機關的存儲空間,記憶體的每一個位元組都有一個唯一的編号,這個編号就是位址。當C程式中定義一個變量時,系統就配置設定一個帶有唯一位址的存儲單元來存儲這個變量,程式對變量的讀取操作,實際上是對變量所在位址存儲空間進行讀取或寫入資料。

 直接引用:通過變量名引用變量(系統自動将變量名轉換為變量的存儲位址)

 間接引用:将變量的位址存放在一個變量中,然後通過存放變量位址的指針變量來引用該變量
           

3、指針變量

一個變量的位址稱為該變量的指針

 用來存放一個變量位址的變量稱為指針變量

 指針變量定義的一般形式為:類型名 * 指針變量名

 注:變量名前面的 "*"是一個說明符,用來說明該變量是一個指針變量,不能省略,但不是變量名的一部分

        類型名表示指針變量所指向的變量類型,而且隻能指向這種類型的變量

  指針變量相關運算符:

  &  取位址運算符

  *  指針運算符,取内容

 注:指針變量用來存放位址,故不能給指針變量賦常數值

       指針變量沒有指向明确的位址前,不能對它所指向的對象指派

 對指針進行加1操作,會使指針指向下一個元素

 示例:指向 int 型資料的指針加1,其指向的位址加4

           指向 char 型資料的指針加1,其指向的位址加1

 了解關鍵:

 将指針的類型分為兩個概念,一個是指針自身的類型,一個是指針指向資料的類型
           

4、單個字元的輸入輸出

getchar( ):從輸入裝置中讀取一個字元

 例:

 char c = getchar( );     等價于    scanf_s("%c",&c,1);

 注:getchar()可以接收回車字元,而scanf()将回車作為資料的間隔符或結束符,且getchar()接收的字元可以不賦給任何變量

 putchar( ):将一個字元輸出到輸出裝置

 例:

 char c = ‘a’;        putchar(c);

 putchar()可以輸出字元型變量、整型變量、字元型常量以及控制字元和轉義字元

 比較:putchar()一次隻能輸出一個字元,而printf()一次能輸出多個字元
           

5、字元串

在C語言中,字元序列當作字元串處理,字元串的處理基于字元數組,字元串在存儲時其尾部添加結束标志‘\0’('\0'代表ANSI碼為0的字元,是一個空操作符)

 字元串初始化方式:

 char c[10] = {"Hello world"};

 char c[10] = "Hello world";

 char c[ ]    = "Hello world";

 char c[9];     scanf("%s",&c,sizeof(c));
           

6、字元串操作函數

puts( ):字元串輸出

 gets( ):字元串輸入

 strlen( ):計算字元串長度

 strcat( ):字元串連接配接

 strcmp( ):字元串比較
           

7、辨析

sizeof( ):計算位元組數,包含 '\0'

 strlen( ) :計算字元串實際長度,不包含 '\0'

 coutof( ):計算字元數組元素個數,包含 '\0'

 三者都将空格計入總數
           

8、二維字元串數組及多元數組

一維字元數組存放一個字元串
 二維字元串數組存放多個字元串
 多元數組可看作是比其少一個次元的數組的集合

 注:二維及二維以上的多元數組,都是先存放低維資料,以此類推
           

9、二維數組初始化:

理論依據:數組元素在記憶體中線性存放

 全部初始化時,按數組存儲順序賦初值
 部分初始化時,高維元素個數可省略,低維元素個數不可省略。但是,要在初始化時展現出高維元素個數,即展現出一維數組個數
           

10、指針數組

不帶下标的二維數組名表示二維數組的起始位址,進行加法操作時則表示作為其元素的一維數組的起始位址
 不帶下标的一維數組名表示一維數組的起始位址,進行加法操作時則表示該一維數組一個元素的起始位址
 即,加法操作時數組降維

 例:

 int a[3][4],*p;
 p = a[0];
 此處p指向一維數組a[0]的起始位址,對其進行加法操作時 p+1 等同于 a[0]+1 ,此時 a[0] 降維至 a[0][0],故其指向數組元素 a[0][1],
           

則 *(p+1)等于元素 a[0][1] 的值

int a[3][4],(*p)[4];
 p = a;
 此處p指向二維數組a的起始位址,對其進行加法操作時 p+1 等同于 a+1,此時 a 降維至 a[0],故其指向數組元素 a[1],
           

則 (p+1)等于一維數組名(起始位址),(p+1)+1 等同于 a[1]+1,則 ((p+1)+1) 等同于 a[1][1]

11、函數指針

函數在記憶體中占有一片連續的記憶體區域儲存其二進制代碼,而函數名在C語言中代表這片連續的記憶體區域的首位址,故函數名可用指針替換

 指向函數的指針變量的一般形式為:

 資料類型 (*指針變量名) (形參表列)

 例: int (*MyFun) (int,int)

 資料類型即函數傳回值類型
 形參表列即函數形式參數表列
           

12、二級指針

指針本身也是變量,是以也有自己的位址。
 我們可以将一個指針變量分為兩個部分,一部分存放變量的位址,另一部分是其自身的位址。了解這一點,二級指針的概念就比較容易了解了。
 故二級指針就是在一級指針的基礎上再增加一個指針,用來存放一級指針的位址,而其本身也有自己的位址,依此類推
           

繼續閱讀