能否向函数传递一个数组?
生活随笔
收集整理的這篇文章主要介紹了
能否向函数传递一个数组?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
能否向函數傳遞一個數組?
例:
void fun(char a[10])?
{?
? ?char c = a[3];?
}?
int main()
{?
? ?char b[10] = “abcdefg”;
? ?fun(b[10]); return 0;
?}
答案:
(1)先看上面的調用,fun(b[10]);將b[10]這個數組傳遞到fun 函數。但這樣正確嗎?b[10]是代表一個數組嗎? 顯然不是,我們知道b[0]代表是數組的一個元素,那b[10]又何嘗不是呢?只不過這里數組越界了,這個b[10]并不存在。但在編譯階段,編譯器并不會真正計算b[10]的地址并取值,所以在編譯的時候編譯器并不認為這樣有錯誤。雖然沒有錯誤,但是編譯器仍然給出了兩個警告:?
warning C4047: 'function' : 'char *' differs in levels of indirection from 'char '?
warning C4024: 'fun' : different types for formal and actual parameter 1?
這兩個警告告訴我們,函數參數需要的是一個char*類型的參數,而實際參數為char 類型,不匹配。雖然編譯器沒有給出錯誤,但是這樣運行肯定會有問題。
(2)b[10]并不存在,在編譯的時候由于沒有去實際地址取值,所以沒有出錯,但是在運行時,將計算b[10]的實際地址,并且取值。這時候發生越界錯誤。
(3)編譯器的警告已經告訴我們編譯器需要的是一個char*類型的參數,而傳遞過去的是一個char 類型的參數,這時候fun 函數會將傳入的char 類型的數據當地址處理,同樣會發生錯誤。
(4)為什么編譯器告訴我們它需要的是一個char*類型的參數?C 語言中,當一維數組作為函數參數的時候,編譯器總是把它解析成一個指向其首元素首地址的指針。這么做是有原因的。在C 語言中,所有非數組形式的數據實參均以傳值形式調用,然而,如果要拷貝整個數組,無論在空間上還是在時間上,其開銷都是非常大的。更重要的是,在絕大部分情況下,你其實并不需要整個數組的拷貝,你只想告訴函數在那一刻對哪個特定的數組感興趣。這樣的話,為了節省時間和空間,提高程序運行的效率,于是就有了上述的規則。所以說:說函數的參數是一個char*類型的指針。
(5)同樣的,函數的返回值也不能是一個數組,而只能是指針。這里要明確的一個概念就是:函數本身是沒有類型的,只有函數的返回值才有類型。
我們完全可以把fun 函數改寫成下面3種形式:
形式一:
void fun(char *p)?
{?
char c = p[3]; //或者是char c = *(p+3);
}
形式二:
void fun(char a[10])?
{?
char c = a[3];?
}
?int main()?
{?
char b[100] = “abcdefg”;
fun(b);?
return 0;?
}
形式三:
void fun(char a[ ])?
{?
char c = a[3];?
}
改寫成這樣或許比較好,至少不會讓人誤會成只能傳遞一個10 個元素的數組。
例:
void fun(char a[10])?
{?
? ?char c = a[3];?
}?
int main()
{?
? ?char b[10] = “abcdefg”;
? ?fun(b[10]); return 0;
?}
答案:
(1)先看上面的調用,fun(b[10]);將b[10]這個數組傳遞到fun 函數。但這樣正確嗎?b[10]是代表一個數組嗎? 顯然不是,我們知道b[0]代表是數組的一個元素,那b[10]又何嘗不是呢?只不過這里數組越界了,這個b[10]并不存在。但在編譯階段,編譯器并不會真正計算b[10]的地址并取值,所以在編譯的時候編譯器并不認為這樣有錯誤。雖然沒有錯誤,但是編譯器仍然給出了兩個警告:?
warning C4047: 'function' : 'char *' differs in levels of indirection from 'char '?
warning C4024: 'fun' : different types for formal and actual parameter 1?
這兩個警告告訴我們,函數參數需要的是一個char*類型的參數,而實際參數為char 類型,不匹配。雖然編譯器沒有給出錯誤,但是這樣運行肯定會有問題。
(2)b[10]并不存在,在編譯的時候由于沒有去實際地址取值,所以沒有出錯,但是在運行時,將計算b[10]的實際地址,并且取值。這時候發生越界錯誤。
(3)編譯器的警告已經告訴我們編譯器需要的是一個char*類型的參數,而傳遞過去的是一個char 類型的參數,這時候fun 函數會將傳入的char 類型的數據當地址處理,同樣會發生錯誤。
(4)為什么編譯器告訴我們它需要的是一個char*類型的參數?C 語言中,當一維數組作為函數參數的時候,編譯器總是把它解析成一個指向其首元素首地址的指針。這么做是有原因的。在C 語言中,所有非數組形式的數據實參均以傳值形式調用,然而,如果要拷貝整個數組,無論在空間上還是在時間上,其開銷都是非常大的。更重要的是,在絕大部分情況下,你其實并不需要整個數組的拷貝,你只想告訴函數在那一刻對哪個特定的數組感興趣。這樣的話,為了節省時間和空間,提高程序運行的效率,于是就有了上述的規則。所以說:說函數的參數是一個char*類型的指針。
(5)同樣的,函數的返回值也不能是一個數組,而只能是指針。這里要明確的一個概念就是:函數本身是沒有類型的,只有函數的返回值才有類型。
我們完全可以把fun 函數改寫成下面3種形式:
形式一:
void fun(char *p)?
{?
char c = p[3]; //或者是char c = *(p+3);
}
形式二:
void fun(char a[10])?
{?
char c = a[3];?
}
?int main()?
{?
char b[100] = “abcdefg”;
fun(b);?
return 0;?
}
形式三:
void fun(char a[ ])?
{?
char c = a[3];?
}
改寫成這樣或許比較好,至少不會讓人誤會成只能傳遞一個10 個元素的數組。
總結
以上是生活随笔為你收集整理的能否向函数传递一个数组?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二维数组初始化的形式有?
- 下一篇: main 函数内的变量是全局变量,还是局