C語言中的指標

2022-07-03 03:33:12 字數 4098 閱讀 1039

請先看c++中的指標概述,這裡只是擴充

陣列指標

其實這裡主要說的就是c++中的指標運算

/*

陣列元素指標:

乙個變數有位址,乙個陣列包含若干個元素,每個陣列元素都有相應的位址,

指標變數可以指向陣列元素(把某一元素的位址放到乙個指標變數中)

所謂陣列元素的指標就是陣列元素的位址

可以用乙個指標變數指向乙個陣列元素

int a[10]=;

int *p;

p=&a[0]; 等同與 p=a; 等同與 int *p=a; 等同與 int*p=&a[0]

注意:1) 陣列名a不代表整個陣列,只代表陣列首元素的位址

p=a 的作用是"把a陣列的首元素的位址賦給指標變數p",而不是"把陣列a各個元素的值賦給p"

陣列指標:

指向陣列元素的指標

陣列指標的作用:

使用陣列指標間接訪問陣列的元素

陣列指標的定義:

int *p;

陣列指標的初始化;

int a[4] =;

int *p = a;//陣列指標,定義了乙個指標變數p賦值陣列的首位址(第乙個元素的位址),p指向陣列的第乙個元素

int *p = &a[0];//等價上面一句話

陣列指標如何訪問陣列的元素:

1) p+1 表示指向陣列的下乙個元素

2) p-1 指向陣列的上乙個元素

誤區:用陣列指標遍歷陣列

for(int i=0;i<4; i++)

//學習的誤區: 陣列名 a 是乙個常量 等同與 *(10++)

//陣列名++ 這是錯誤的

printf("*a=%d\n",*a++);//這種寫法是錯誤的

*/

逆序陣列:把陣列中的內容前後對調

void nixuarray(int a,int len);

pa[0] a的位址

pa 陣列的首位址,又是變數a的位址

//使用陣列名來訪問 a的值

printf("%d\n",**pa);

int a1[2][2]=;

//定義了乙個指標陣列,賦值為a1[0]是第一行的指標

int *pa1[2]=;

printf("**pa1=%d\n",**pa1);

//*pa1 取到的是指標陣列pa1中首位址的值= a1[0]

//同時a1[0] = a1的首位址

*pa1 = a1[0]

printf("&a1[0] = %d\n",a1[0]);

printf("*pa1 = %d\n",*pa1);

//正推

//所以 **pa1 即 *(*pa1)=*(*pa1[0])=*(a1)=*(a1[0])=*(&(a1[0][0]))=a1[0][0] =1;

//**(pa1+1)=*(*(pa1+1))=*(*pa1[1])=*(a1[1])=*(&(a1[1][0]))=a1[1][0]=3

//逆推

//所以想拿數字2的時候 就相當於

2=a1[0][1]=*(&a1[0][1])=*(&a1[0][0]+1)=*(a1[0]+1)=*(a1+1)=*(*pa1[0]+1)=*(*pa1+1)

//拿數字3

3=a1[1][1]=*(&a1[1][1])=*(&a1[1][0]+1)=*(a1[1]+1)=*(pa1[1]+1)=*(*(pa1+1)+1)

陣列名訪問二維陣列

公式 *(*(a+i)+j) == a[i][j]
用普通指標訪問二維陣列

//這種寫法雖然也可以獲取到二維陣列中的元素,但是這樣寫是不符合規範的,利用了記憶體儲存的機制

資料在記憶體中存放的方式,從高位址依次向下存放

int a[3][4]=;

int *p=a

for(int i=0;i<12;i++)

二維陣列指標

一般形式:

資料型別 (*指標變數名)[二維陣列列數];

其中"型別說明符"為所指陣列的資料型別. 「*」 標示其後的變數是指標型別

如要將二維陣列賦給一指標,應這樣賦值:

int a[3][4];

int (*p)[4]; //該語句是定義乙個陣列指標,指向含4個元素的一維陣列

p=a; //將該二維陣列的首位址賦給p,也就是a[0]或 &a[0][0]

p++; //該語句執行過後,也就是p=p+1; p 跨過行a[0] 指向行a[1]

所以陣列指標也稱指向一維陣列的指標

遍歷二維陣列的元素

int a[3][4]=;

int (*p)[4]=a;

所以之前遍歷中的 陣列a 可以替換為 p :*(*(p+i)+j)

指標陣列和二維陣列指標變數的區別

int *pa[3]=; pa是乙個指標陣列

int *pa1[2]=

int (*pa)[3] ;//二維陣列指標

應該注入指標陣列和二維陣列指標變數的區別,這兩者雖然都可以用來標示二維陣列,但其表示方法和意義是不同的

二維陣列指標變數是單個的變數,其一般形式中(*指標變數名)兩邊的括號不可少,而指標陣列型別表示的是多個指

針(一組有序指標)在一般形式中"*指標陣列名"兩邊不能有括號.

例如:int(*p)[3]; //表示乙個指向二維陣列的指標變數,該二維陣列的列數為3或分解為一維陣列的長度為3

int *p[3]; //表示p是乙個指標陣列,有三個下標變數p[0],p[1],p[2]均為指標變數

字串指標

char *變數名 ="字串內容" // "字串內容"是常量

//當指向的為'' 單引號時,為字元指標 ""雙引號時為字串指標

字串指標與字元陣列的區別

//字串指標  指向可以改變

char *ss="abc";

ss="bcd";

//字元陣列

char s1="abc";

s1="hello" 這是錯誤的 可以改變裡面的內容但是不能重新指向

指標函式

乙個函式的返回值型別是指標,我們就稱為指標函式

格式:型別說明符 * 函式名( 形參表)

例://返回兩個數中的大數的位址

//返回的是形參x 和 y 中大數的位址

int * max( int x,int y)

函式指標

函式指標

在c語言中,乙個函式總是占用一段連續的記憶體區,而函式名就是該函式所佔記憶體區的首位址。

我們可以把函式的這個首位址(或稱入口位址)賦予乙個指標變數,使該指標變數指向該函式.然後通過指標變數就可以找到並呼叫這個函式.我們把這種指向函式的指標變數稱為"函式指標變數"

函式指標定義方法:

函式指標變數定義的一般形式為:

型別說明符 (*指標變數名)(函式的引數);

其中"型別說明符" 表示被指函式的返回值的型別

"(* 指標變數名 )" 表示 "*" 後面的變數是定義的指標變數

函式的宣告:

int sum(int a,int b);----->函式指標 int (*p)(int a,int b);

//定義了乙個函式指標p

//p可以存放返回值是int型別, 並且有兩個形參,形參的型別還都是int型別的函式的位址

//函式指標的初始化

p = sum;//sum存得就是函式在記憶體中的首位址

//定義函式指標的時候,可以不用寫形參名

int (*p)(int int);

函式指標的使用

1.定義函式指標

int(*p) (int int);

2.給函式指標初始化

p=sum;

3.用函式指標間接的呼叫函式

int s=p(23,45);

函式指標的用處:

例如 + - x /時 ,只需要判斷符號 ,然後 p = sum / p = jian 就可以

C 語言中的指標

指標是 c 語言中的精華,正確靈活的運用指標,可以表示複雜的資料結構,動態分配記憶體,方便使用字串和陣列,呼叫函式返回多結果,直接處理記憶體單元等等。位址就是記憶體的編號,如果拿旅店作為記憶體,那麼每個房間號其實就相當於位址了。當程式編譯時,就會對變數分配記憶體單元,分配時按變數型別分配大小。經過編...

C語言中的指標

隨著程式語言的越來越多,但c語言在程式語言中的地位似乎始終沒有改變,其中得益於c語言中的指標,可以直接去操作記憶體位址與暫存器,執行效率也高,在嵌入式領域運用得尤其廣泛。對於初學者來說指標是c語言中很難翻越的一座大山,指標的掌握程度直接關係到c語言的掌握程度,其實指標並不是那麼高不可攀,只是紙老虎而...

C語言中的指標

指標是c語言中非常重要的東西,書本上寫了好多來解釋裡面的原理,當年老師也跟我們講了好多這方面的東西,一直就是感覺沒有聽明白。直到我看到了指向指標的指標,我建立了自己的理解,不知道是否正確,但是基本能解決遇到的問題。int p p i p。type p,宣告指標變數,type 例如int 告訴計算機p...