數組做輸入,退化爲指針
以一個簡單的程序爲例,如給數組排序
void print_array(int *arr, int len);
void sort_array(int *a, int n);
int main(void)
{
//建立一個無序的數組
int a[] = { 10,11,2,3,5,88,4,6,4,32,12 };
//獲取元素個數
int n = sizeof(a) / sizeof(a[0]);
printf("排序前\n");
//首先進行一次輸出,數組、長度作爲輸入參數
print_array(a, n);
//給數組排序
sort_array(a, n);
printf("排序後\n");
//再次輸出數組的元素
print_array(a, n);
printf("\n");
system("pause");
return 0;
}
void print_array(int *arr, int len)
{
int n = sizeof(arr) / sizeof(arr[0]);//元素個數
printf("指針型數組長度%d\n",n);
int i = 0;
for ( i = 0; i < len; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
void sort_array(int *a, int n)
{
int i, j;
int temp;
//選擇法排序
for (i = 0; i < n - 1; i++)
{
for (j = i + 1; j < n; j++)
{
if (a[i] > a[j])
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
}
執行結果如下
在上面的程序中,數組a作爲一個參數被傳入函數sort_array()和print_array(),跟它同時被傳入的還有數組長度n,爲什麼需要這兩個參數?
以函數print_array()爲例
void print_array(int *arr, int len)
{ //int型有32位,4個字節,arr[x]也是32位,4個字節
int n = sizeof(arr) / sizeof(arr[0]);//元素個數
printf("指針型數組長度%d\n",n);
int i = 0;
for ( i = 0; i < len; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
可以看到,數組 a 被交給了形參 int *arr 這就是一個標準的指針,而對於函數print_array()來說,不論 a 是個指針、地址、數組名甚至是一個NULL,它都會被當做一個指針使用,C語言就是這麼單純不做作。
不過這也帶來了一個問題,它把 a 當成指針了,那數組的長度怎麼獲得呢?只通過 a 本身是怎麼也不可能知道的。就像是print_array()的第3、4行
int n = sizeof(arr) / sizeof(arr[0]);//元素個數
printf("指針型數組長度%d\n",n);
這句話使用了算數組arr中的元素個數的,很常見,它的輸出結果在上面就出現過了,n = 1,也就是說在arr中數組長度這個信息是不存在的,這就是爲什麼
void print_array(int *arr, int len)會用到第二個參數int len,它的作用就是告訴print_array()我給你傳進去的數組它有多長。
總的來說,這篇博客想表達的只有一句話:
如果數組作爲函數參數,數組形參退化爲指針
————————————————
版權聲明:本文爲CSDN博主「三日凌空」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_42182035/article/details/98853900