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

2021-07-09 12:12:36 字數 3142 閱讀 8713

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

#include

int main(int argc,char *argv)

; printf("%p

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

return

0;}

那我們在看下面**:

答案顯而易見,就是a&a[0]是一樣的,但是&a雖然和它們的值一樣,意義卻不相同,因為&a代表的是一種型別的首位址,因此我要說陣列是一種型別,就像intlong一樣,它代表的是一種型別,比如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;p5;)

printf("%d ",*p++);

printf("\n");

}

我們可以用陣列名來直接作為指標,也可以將陣列名賦給我們提前準備好的指標p。並且由於陣列的所有元素在邏輯上是按順序存放的,所以p指向陣列中的乙個元素,而p+1就指向它的下乙個元素。但是我們不能依次對a++來取得後續元素的值,因為a只表示a[0]元素的位址,這是已經確定了的。還要注意p++和++p的不同:

*p++:先取得目前p的值所指向空間的值,然後立馬對p的值加1;

*++p:先對目前p的值加1,然後再取p所指向空間的值;

(2)二維陣列與指標陣列。

#include

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");

p先與[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");

}

for(j = 0;j

< strlen(p);j++)

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 1 234...

指標與陣列與函式指標

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