第七天
好多學生都認為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...