c語言指標筆記

2022-04-25 18:12:13 字數 1914 閱讀 8609

一.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 列...