一.int a[20]
1. 陣列名代表陣列首元素的位址,不代表陣列的位址
2. 對陣列名取位址代表整個陣列的位址.
a和&a代表的資料型別不一樣 a代表陣列首元素的位址 &a陣列型別 int[20]型別
陣列的型別由元素的型別和陣列大小共同決定 如:int array[5] 的型別為int[5]
陣列型別:
typedef int(myint5)[5]; myint5為長度為5的陣列型別
typedef float[myfloat10][10] myfloat10 為長度為10的浮點陣列型別
陣列定義:
myint5 iarray;
myfloat10 farray;
二. 陣列指標
1. 使用陣列型別來定義陣列指標:
typedef int(myint5)[5]; // myint5為長度為5的陣列型別
myint5 * parray;//定義乙個指向陣列型別的指標變數
int e[5]=;
parray = &e;//對陣列指標賦值,需要對陣列名取位址
2. 直接定義乙個陣列指標
int (*p)[5] //定義乙個指向5個整形型別的陣列指標
int a[5] = ;
p = &a;
//用陣列指標去遍歷陣列
for(int i = 0; i<4;i++)
三. 二維陣列解析
int a[5][6];
陣列名代表陣列首元素的位址 所以a是乙個陣列指標,它的步長為6, 相當於 int(*p)[6]
四. 函式指標作為函式引數的三種模型
模型一:二維陣列作為函式引數
因為陣列在傳遞給函式作為函式引數的時候會出現退化的情況,會退化為指標,
所以二維陣列在傳參的過程中也會變成指標,例如:把二維陣列 char a[5][100]要作為
引數傳遞給乙個函式,那麼函式的宣告可以用下列方式宣告:
void f(char a[5][100]);
void f(char a[100]);//因為陣列會退化成指標,所以第乙個方括號中的長度沒有也可以
void f(char (*a)[100]);//在第二個的基礎上,編譯器會把陣列轉化為指標,而這個指標應該能正確反映出a+1代表的步長,所以應該引數宣告為陣列指標,而不能是二級指標char **p;因為二級指標進行*操作,例如(*p)+1那麼步長是4,因為
進行*p操作,(*p)是 char *型別,char * 型別的長度是4,而陣列的步長在這裡是100,所以會出現錯誤
模型二:指標陣列作為函式引數
指標陣列其實是乙個陣列,陣列的成員指標型別: 例如: char *p[100];
因為是陣列,所以在傳遞給函式引數的時候,會退化成指標,所以函式可以這樣宣告:
void f(char * p[100]);
void f(char *p);//陣列會退化成指標,所以有沒有陣列長度都無所謂
void f(char **p);在第二步的基礎上,繼續退化成指標型別,就變成了二級指標.
模型三:程式設計師手動使用malloc函式分配記憶體
首先分配乙個陣列,陣列的成員是指標型別,每個成員分別指向乙個一維陣列,例如:
char **myarray = (char **)malloc(10*sizeof(char*)); //int array[10]
if (myarray == null)
for (i=0; i<10; i++)
sprintf(myarray[i],"%d%d%d ", i, i, i);
}這種模型和模型二基本一樣,只不過是程式設計師手動分配的記憶體空間,所以在使用完後要及時釋放指標,防止memory leak;
綜上所述:
二維陣列作為函式引數應該使用陣列指標來宣告函式引數
指標陣列作為函式引數應該使用二級指標來宣告函式引數
c語言指標筆記
一 表示這是乙個指標變數,表示乙個變數的位址。二 與 的區別 int a p a 此處 p就是先執行 p,即去取p所指位址的值,相當於 p取出變數a,再進行取位址操作,p即取出a的位址,相當於 a.此處 a就是就是先計算 運算,即先取出a的位址,然後進行 運算,取出位址上的值,即變數a。三 一維陣列...
C語言指標筆記
1 指標本身也是乙個變數,儲存的是另乙個變數的位址 2 使用指標的好處 增加訪問資料的手段,使程式更加的靈活 3 所有的指標變數都是占用4個位元組 32位 4 訪問指標所指向的變數的兩種方式 int a 5 int p a printf d n a 1.通過變數名直接訪問 printf d n p ...
c語言指標筆記
指標是乙個變數,變數的值是記憶體位址。int a 10 指標型別為 int 指標指向型別 int 列印 a 會輸出10 列印 a 會輸出變數a所在的記憶體位址 列印 q 會輸出變數a的值的記憶體位址 列印 q 會輸出指標q指向的記憶體位址 int q a 指標型別為 int 指標指向型別 int 列...