指標與陣列,指標與函式,指標與字串

2021-08-21 06:55:42 字數 2485 閱讀 8154

指標與陣列,指標與函式,指標與字串

一:指標與陣列

首先我想解釋清楚指標與陣列名的關係,由下面的**引入問題,不知道大家有沒有好奇過為什麼它們三個是一樣的?

#include

int main(int argc,char *argv)

;printf("%p %p %p\n",a,&a,&a[0]);

return 0;}1

2345

67那我們在看下面**:

#include

int main(int argc,char *argv)

;printf("%p %p %p\n",a,&a,&a[0]);

printf("%p %p %p\n",a+1,&a+1,&a[0]+1);

return 0;}1

2345

678答案顯而易見,就是a和&a[0]是一樣的,但是&a雖然和它們的值一樣,意義卻不相同,因為&a代表的是一種型別的首位址,因此我要說陣列是一種型別,就像int和long一樣,它代表的是一種型別,比如int a[5]的型別就是int [5],這種型別代表的是乙個包含五個int元素的型別,它與int b[10]的型別不同,int b[10]的型別是int [10]代表包含十個int元素的型別。所以呢,&運算子取出來的是型別的首位址,這時候它不是指標,還有一種意外情況是sizeof運算子,它的作用是計算型別所占用的位元組數,因此sizeof(a) = 20,除了這兩個特殊情況,其他情況均轉換成指標,即除了在&和sizeof的時候,其餘情況的陣列名均轉換成指標。

(1)指標與一維陣列:我們可以用陣列名來遍歷陣列。看下面**:

#include

void main(void)

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

printf("%d ",*(a+i));

printf("\n");

for(p = a;p

void main(void)

;int *p[5];

int i;

int **pp = p;        //定義乙個2級指標讓他等於p

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

printf("\n");

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

printf("%d ",**(pp+i));      //pp = p; **pp = **p = **&&a[0] = a[0] = 1

printf("\n");12

3456

78910

1112

1314

1516

1718

19p先與[5]結合,構成擁有5個元素的陣列,陣列中每個成員都是int *型別的,即都指向乙個int元素,也就是a中的對應元素,p作為陣列名,就已經是指標的指標了,所以我們可以像注釋中那樣描述。 

注意:區別int(*p)[5] 和int *p[5]的不同:

int(*p)[5]:它是乙個指向「擁有五個int型別元素的陣列」的指標,長度為1。 

int *p[5]:它是乙個指標陣列,有5個元素,長度為5,每個元素都是指標,並且指向的是int 型別的元素。

二:指標與函式

(1)返回指標的函式:int *f(int,int); 

由於()的優先順序高於*,所以f會先與()結合構成函式,因此上面的宣告說明了函式f的返回值是乙個指向int元素的指標,我們在鍊錶的相關操作中就經常這樣用,在函式的結尾return回來鍊錶的頭指標以便後續操作。 

(2)指向函式的指標:int (*f)(int,int); 

現在*f的身份發生了變化,它成為了乙個指向函式的指標,乙個函式的函式名比較特殊,它指向乙個函式,是乙個指標。現在f指向的這個函式引數為兩個int型別元素,函式返回值也為int元素。我們經常把這種指標用在作為函式的形參:

int func(int,int,int(*f)(int,int));

這條函式宣告就說明了func函式中的第三個引數是「返回值為int,並且引數為2個int型別元素」的函式,我們需要在宣告的時候將函式的描述值說出來,但是在func函式中不一定就需要第三個引數,即就是那個「返回值為int,並且引數為2個int型別元素」的返回值。這也是我們有時候在看一些函式宣告的時候會不懂的原因。這個問題我在部落格中也說過:簡單理解函式宣告 

(3)返回指向函式指標的函式:int (*func(int))(int,int); 

上面的宣告這樣理解,func為函式,它是乙個只有乙個引數,並且為int型別的函式,但是它的返回值是乙個函式指標,為int(*)(int,int),這個函式指標指向這樣乙個函式:返回值為int 型別,引數為兩個int型別。(這一點也可以看上面的部落格)

三:指標與字串

#include

void main(void)

printf("\n");}1

2345

6789

1011

1213

1415

1617

for(j = 0;j < strlen(p);j++)12

34ht

c指標陣列與陣列指標與指標函式與函式指標筆記

include include typedef struct t ooxx t ooxx,pt ooxx 測試陣列指標 void test ooxx arrayp t ooxx p int num 測試指標陣列 void test ooxx parray t ooxx p,int num 測試函式指...

指標與陣列,指標與函式,指標與字串

首先我想解釋清楚指標與陣列名的關係,由下面的 引入問題,不知道大家有沒有好奇過為什麼它們三個是一樣的?include int main int argc,char argv printf p p p n a,a,a 0 return 0 那我們在看下面 答案顯而易見,就是a和 a 0 是一樣的,但是...

指標與陣列與函式指標

變數的本質是一段儲存空間的別名,指標的本質是一種特殊型別的變數,這種變數的儲存空間中儲存的是另乙個變數的位址。號的意義 號代表所申明的變數是指標 號表示取指標所指向記憶體空間的值。該使用傳值呼叫還是傳址呼叫 當函式內部需要改變實參的值,則需要使用傳址呼叫 如果函式需要傳入的引數型別複雜,體積巨大,又...