翁愷老師C語言學習筆記(十)指標 指標與陣列

2021-09-24 20:26:39 字數 4024 閱讀 2847

· 當我們向一段函式傳入陣列變數,引數接收到的是值,如果我們傳入指標時,引數接收到的是也是值(乙個位址);

· 如果傳入函式的是乙個普通變數,它接收到的是乙個值

· 如果傳入函式的是乙個指標,它接收到的也是乙個值(位址)

· 如果傳入的是乙個陣列,它接收到的是什麼?

我們來看個例子

#include void minmax(int a, int len, int *min, int *max); 

int main(void)

; int min,max;

minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);

printf("min=%d,max=%d\n",min,max);

return 0;

}void minmax(int a, int len, int *min, int *max)

}}

分別在main函式和minmax函式裡列印出sizeof(a)的大小

#include /*

取出一組陣列裡的最小的和最大的值

*/ void minmax(int a, int len, int *min, int *max);

int main(void)

; int min,max;

/*[error] cannot convert 'const char*' to 'int*' for argument '1' to 'void minmax(int*, int, int*, int*)'*/

minmax("main sizeof(a)=%lu\n",sizeof(a)); // main呼叫之前再看下minmax的大小

minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);

printf("min=%d,max=%d\n",min,max);

return 0;

}void minmax(int a, int len, int *min, int *max)

}}

main函式裡,

sizeof(a)=68

minmax函式裡,

sizeof(a)=4

注意:我的編譯器這裡會報錯,而老師的只是乙個警告([error] cannot convert 'const char』 to 『int*』 for argument 『1』 to 『void minmax(int*, int, int*, int*)』)*

無法將引數』1』的』const char』轉換為』int*『傳入』void minmax(int*, int, int*, int*)』*

看到警告或者報錯後,我們再試一段**

#include /*

取出一組陣列裡的最小的和最大的值

*/ void minmax(int a, int len, int *min, int *max);

int main(void)

; int min,max;

printf("main a=%p\n",a);

minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);

printf("min=%d,max=%d\n",min,max);

return 0;

}void minmax(int a, int len, int *min, int *max)

}}

執行結果

main a=0062fe44

minmax a=0062fe44

將檢視a的大小語句改為檢視a的指標位址,兩個值獲取是一樣的

問題來了

從這裡可以看出maina其實就是minmax裡的a

在這裡我們再將minmax函式裡的a[0]=1000來看看結果,再回到main裡時,它會發生怎樣的改變

#include #include /*

取出一組陣列裡的最小的和最大的值

*/ void minmax(int a, int len, int *min, int *max);

int main(void)

; int min,max;

printf("main a=%p\n",a);

minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);

printf("a[0]=%d\n",a[0]); //執行main後我們檢視a[0]等於多少

printf("min=%d,max=%d\n",min,max);

return 0;

}void minmax(int a, int len, int *min, int *max)

}}

main a=0062fe44

minmax a=0062fe44

a[0]=1000

min=2,max=1000

從這裡可以看出來a它就是乙個指標

剛才報錯 main函式裡獲取sizeof(a)的個數,原因是因為a它是乙個指標

現在我們將兩個函式的a全部改為*a, 看看編譯是否會通過

· 函式引數表中的陣列實際上就是指標

· sizeof(a) ==sizeof(int)

· 但是可以用陣列的運算子進行運算*

· 以下四種函式原型是等價的:

· int sum(int *ar,int n);

· int sum(int *,int);

· int sum(int ar, int n);

· int sum(int, int);

**· 資料變數本身表達位址,所以

· int a[10];int *p =a; //無需用 &取位址

· 但是陣列的單元表達的是單個變數,對單個需要用&取位址

· a == &a[0]

· 運算子可以對陣列做,也可以對指標做:

· p[0]=*p

· 運算子可以對指標做,也可以對陣列做:

·a = 25

· 陣列變數是 const的指標,所以不能被賦值,兩個陣列之前不能互相賦值

· int[a] <==> int * const a=…

#include /*

取出一組陣列裡的最小的和最大的值

*/ void minmax(int *a, int len, int *min, int *max);

int main(void)

; int min,max;

printf("main a=%p\n",a);

minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);

printf("a[0]=%d\n",a[0]); //執行main後我們檢視a[0]等於多少

printf("min=%d,max=%d\n",min,max);

/* 驗證p[0]=*p */

int *p= &min;

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

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

/* 驗證*a=a[0]*/

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

return 0;

}void minmax(int *a, int len, int *min, int *max)

}}

執行結果

main a=0062fe40

minmax a=0062fe40

a[0]=1

min=1,max=55

*p=1

p[0]=1

翁愷老師C語言學習筆記(七)函式

includeint main printf d到 d的和是 d n 1,10,sum for i 20,sum 0 i 30 i printf d到 d的和是 d n 20,30,sum for i 35,sum 0 i 45 i printf d到 d的和是 d n 35,45,sum retu...

C語言學習筆記02 指標

指標也是一種變數,占有記憶體空間,用來儲存記憶體位址。在指標宣告時,號代表所宣告的變數為指標。在指標使用時,號表示操作指標所指向的記憶體空間的值。p相當於通過位址 p變數的值 找到一塊記憶體,然後操作記憶體。p放在等號的左邊賦值 給記憶體賦值 p放在等號的右邊取值 從記憶體獲取值 指標變數和它所指向...

C語言學習筆記(四) 指標

c語言學習筆記 四 指標 include intmain p就是乙個指標,p就是取出p指向位址的值 陣列 相同型別的資料集合 include intmain 在這個程式中,p是乙個指標,a是乙個陣列,若p a 0 或者p a就是p指向陣列的第乙個元素,接下來就可以對p進行 1或 1進行偏移操作 in...