· 當我們向一段函式傳入陣列變數,引數接收到的是值,如果我們傳入指標時,引數接收到的是也是值(乙個位址);
· 如果傳入函式的是乙個普通變數,它接收到的是乙個值
· 如果傳入函式的是乙個指標,它接收到的也是乙個值(位址)
· 如果傳入的是乙個陣列,它接收到的是什麼?
我們來看個例子
#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)=68minmax函式裡,
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將檢視a的大小語句改為檢視a的指標位址,兩個值獲取是一樣的minmax a=0062fe44
問題來了
從這裡可以看出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從這裡可以看出來a它就是乙個指標minmax a=0062fe44
a[0]=1000
min=2,max=1000
剛才報錯 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=0062fe40minmax 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...