跟我一起學C語言(第七天)

2021-09-30 13:43:55 字數 2801 閱讀 3141

第七天

好多學生都認為c語言中指標是最難的,在我看來,並沒有想象的那麼難,希望讀者不要害怕指標。

指標:

位址從記憶體分配

什麼位址?乙個位址就是乙個編號,編號和編號之間相差乙個位元組,如果位址需要儲存占用4個位元組

什麼指標? 指標常量和指標變數

指標常量就是位址編號

指標變數就是存放位址編號的變數

通常直接將指標常量和指標變數簡稱為指標。

如何定義指標變數。

*** *p;  

***代表了乙個資料型別

int a = 10;

int *p = &a; *和int結合構成了乙個指標型別叫做int *

*p = 20;本質修改了a的內容

操作的是指標變數指向的空間內容(乙個空間包含多個位址編號,其中第乙個位址編號就可以被稱為指向了這個空間,

指標變數存放空間首位址編號,所以也可以直接描述為指標變數指向了這個空間)。

算數運算子:+ - ++ --

int a = 10;

int *p = &a;

p + 1跳過的位元組數和p指向的空間的型別相關

*p ++  列印結果為10  p指向偏移了

(*p)++ 單純列印也是10  p指向沒有改變

int *p;叫做野指標

int a = 0x12345678;

char *p = (char *)&a;

*(p + 1) 獲取了 0x56 

*(p + 3) 獲取了 0x12 

一級指標和一維陣列的關係

陣列名是乙個常量位址 

int a[5] = ;

//int *p1 = &a[0];

//int *p2 = &a[1];

int *p = a;

p + i <==> a + i

*(p + i) <==> *(a + i)    <==> a[i]

/\ 操作a+i指向的空間內容

||\/

p[i]

例子:

#include

int main(int argc, const char *ar**)

指標和二維陣列關係

int a[2][3];當作乙個特殊的一維陣列,定義如下:*** a[2]; ***是12位元組的型別

a[0],a[1]都是a陣列中的元素。每個元素是12個位元組——12位元組包含了3個整型,所以認為a[0],a[1]都代表了乙個一維陣列

「a[0],a[1]都代表了乙個一維陣列」 <==> 普通的一維陣列陣列名是整個陣列空間首位址

普通的一維陣列名 + 1跳過了陣列名代表的陣列內部中乙個元素。<==> a[0] + 1跳過了a[0]代表的一維陣列中乙個元素

二維陣列中:

int a[2][3];<==> int (a[2])[3]; ==>轉化後的型別是 int (*)[3];

行序優先

定義變數:資料型別 變數名;

int (*)[3] p;  通過型別定義的乙個變數

這裡的p本質也是行指標

編譯器識別的用法:int (*p)[3];很多資料上被叫做陣列指標(乙個指向陣列的指標)

p = a;

行指標a + i <==> &*(a + i) <==> &a[i]

p + i <==> &*(p + i) <==> &p[i]

列指標a[i] + j <==> *(a + i) + j

p[i] + j <==> *(p + i) + j

例子:

#include

int main(int argc, const char *ar**)

,,};

//int (*)[4] p;//這裡的錯誤是編譯器問題,老版本編譯器允許這樣做。現在編譯器不允許。

int (*p)[4];//如果有乙個指標型別是 *** (*)yyy,定義的變數或者陣列或者函式,都放到括號內部*的後面

//這裡為什麼出現[4],就是為了告訴指標,每次加1跳一行時,需要跳過4個元素。

p = a;

int i,j;

for(i = 0;i < 3;i ++)

}printf("\n");

return 0;

}

指標和指標陣列的關係:

char *str[2];

char **p = str;

char (*str[2])[3];<==> char (*)[3] str[2];這是乙個陣列,裡面存的是

char (*)[3] *p = str; <==> char (**p)[3] = str; 

int *q;

p = (char (**)[3]) q; 

char (*str[2][3])[4];這是什麼?二維陣列,存char (*)[4];

<==> char (*)[4] str[2][3];

char (*)[4] (*)[3]  p; <==> char (*(*p)[3])[4];

C語言第七天

今天學習了結構體這個高大上的東西,在與函式結合的時候,我徹底懵了.做作業的時候我老忘記結構體是一種我自己定義的資料型別 老想著用int之類的型別.這樣就容易懵了,下次我一定要注意這些問題.結構體是一種自定義的資料型別 用struct關鍵字宣告乙個結構體 struct point 定義乙個結構體變數 ...

C 學習第七天

c 中的params引數 引數陣列 1 params引數是陣列。呼叫方式可以陣列方式,也可以單個元素方式。static void test string name,params int scores console.writeline 你好,你的scores is name,sb test 劉德華 ...

C 基礎第七天

1 ref引數 ref引數側重於將乙個變數以引數的形式帶到乙個方法中進行改變,改變完成後,再講改變後的值帶出來。在使用ref引數的時候需要注意 ref引數在方法外必須為其賦值。2 方法的過載 方法的過載指的是方法的名稱相同,但是引數不同。引數不同 1 如果引數的個數相同,那麼引數的型別就不能相同。2...