1. 程式人生 > >傳遞陣列的引用 這樣就解決傳遞長度的問題了

傳遞陣列的引用 這樣就解決傳遞長度的問題了

如果一個函式以一維陣列為引數,我們可以這樣宣告這個函式

void func(int* a) ;
void func(int a[]) ;
void func(int a[3]) ;

實際上,這三種形式是等價的,在使用陣列做引數時,編譯器會自動將陣列名轉換為指向陣列第一個元素的指標,為什麼呢?這要從引數的傳遞方式說起,引數有三種傳遞方式,按值傳遞,按指標傳遞,按引用傳遞,分別如下

void Test(int a) ;
void Test(int* a) ;
void Test(int& a) ;

第一種方式傳遞的是a的一個副本

第二種方式傳遞的是指向a的指標的一個副本

第三種方式傳遞的是指向a的引用的一個副本

既然都是副本,那麼就存在拷貝到過程,但是,陣列是不能直接拷貝的,也就是不能像下面這樣

int a[3] = {1, 2, 3} ;
int b[](a) ;    // error
int b[3] ;
b = a ;            // error
不能用一個數組初始化另一個數組,也不能將一個數組直接賦值給另外一個數組,如果想複製陣列,唯一的辦法就是逐個元素複製。
int a[3] = {1, 2, 3} ;
int b[3] ;
for (int i = 0; i < 3; ++i)
{
    b[i] = a[i] ;
}

既然陣列不能拷貝,那麼引數該如何傳遞呢?於是編譯器就將陣列名轉換成了指向第一個元素的指標,指標是可以拷貝的。但是這也引發了另外一個問題。我們無法只通過陣列名得知陣列元素的個數。看下面的程式碼

void Test(int a[3])
{
    for (int i = 0; i < 5; ++i)
    {
        cout << a[i] << endl ;
    }
}

明明只傳遞了三個元素的陣列,為什麼輸出5個元素?前面已經說了,陣列被轉換成了指向第一個元素的指標,所以上面的程式碼和下面的相同

void Test(int* a) //我只知道a是個指標,跟本不知道a指向多少個元素
{
    for (int i = 0; i < 5; ++i)
    {
        cout << a[i] << endl ;
    }
}

編譯器根本不知奧陣列a有多少個元素,它甚至不知道a是陣列!如何解決呢,一種辦法是再加一個引數,指定元素個數

void Test(int* a, int n)
{
    for (int i = 0; i < n; ++i)
    {
        cout << a[i] << endl ;
    }
}

另外一種辦法是傳遞陣列的引用,這才是本文的重點,唉,前面這麼多廢話:(

void Test(int (&a)[3])
{
    for (int i = 0; i < 3; ++i)
    {
        cout << a[i] << endl ;
    }
}

這樣寫陣列a就不會被轉換為指標了,而且有了元素個數的資訊,呼叫的時候,也必須傳遞一個含有3個元素的陣列

int a[3] = {1, 2, 3} ;
Test(a) ;    // ok
int b[1] = {1} ;
Test(b) ;    // error, can not convert parameter a from int[1] to int(&)[3]

And that’s all, Happy coding!

==The End==

相關推薦

傳遞陣列引用 這樣解決傳遞長度的問題

如果一個函式以一維陣列為引數,我們可以這樣宣告這個函式 void func(int* a) ; void func(int a[]) ; void func(int a[3]) ; 實際上,這三種形式是等價的,在使用陣列做引數時,編譯器會自動將陣列名轉換為指向陣列第一個元素的指標,為什麼呢?這要從引數的傳遞

這一次,徹底解決Java的值傳遞引用傳遞

信息 getter 數據類型 裝載 而已 訪問 實參 數據結構 修改 本文旨在用最通俗的語言講述最枯燥的基本知識 學過Java基礎的人都知道:值傳遞和引用傳遞是初次接觸Java時的一個難點,有時候記得了語法卻記不得怎麽實際運用,有時候會的了運用卻解釋不出原理,而且坊間討論

ajax解決傳遞陣列的問題

前端程式碼: $.ajax({ type: "POST", url: "../station/refreshGunInfo", data: {gunLists:gunNumA}, traditional: true, //解決傳遞陣列的問題 asyn

Java之路:陣列引用傳遞

一、引用 int[] a = new int[10]; int[] b; b = a; 讓陣列b直接指向陣列a(即b = a;),這樣做的目的是為了提高程式執行的效率。 試想一下,假如陣列中有上萬個元素,在拷貝陣列時,如果將陣列a的所有元素都一一拷貝至陣列b,時間開銷很大,有時

來一次徹底解決Java的值傳遞引用傳遞

本文旨在用最通俗的語言講述最枯燥的基本知識 學過Java基礎的人都知道:值傳遞和引用傳遞是初次接觸Java時的一個難點,有時候記得了語法卻記不得怎麼實際運用,有時候會的了運用卻解釋不出原理,而且坊間討論的話題又是充滿爭議:有的論壇帖子說Java只有值傳遞,有的部落格說兩者皆

js陣列引用傳遞

著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。作者:Intopass連結:http://www.zhihu.com/question/26042362/answer/31903017來源:知乎a = [4,5,6];//改變的是a引用本身,沒有改變陣列物件a.pop();//改變的是陣列

Angular的地址監聽與JS陣列引用傳遞方式帶來的衝突

業務需求:在對checkbox的選擇後,希望將選擇到的資料列印在input框中。 程式碼實現過程: <input type="text" ng-model="test"> <input type="button" ng-click="click()"&g

c語言傳遞陣列給函式的三種方式(注意均為引用傳遞)

一、形參為一個指標voidmyFunction(int *param){...}二、形參為一個已知大小的陣列voidmyFunction(intparam[10]){...}三、形參為一個位置大小的數字(通常把大小也作為引數傳遞過去)voidmyFunction(intpar

函式通過引用傳遞陣列(修改原陣列

//http://pppboy.blog.163.com/blog/static/3020379620138132495934/一、大概區別就像指標的陣列和陣列的指標一樣耐人尋味//array首先向右結合,所以這個相當於 (int&)array[] array是個陣列

C++引用&函式傳遞陣列例子

#include <iostream>using namespace std;/*排序*/void xll(int (&ac)[5]);//排序函式int main(){    int a[5] = {1,8,5,6,3};    xll(a);    r

php陣列和物件的值傳遞引用傳遞

一般的資料型別(int, float, bool)不做這方面的解說了 這裡詳細介紹一下陣列和的類的物件作為引數進行值傳遞的區別 陣列值傳遞 例項程式碼: ? <?php function

Java值傳遞以及引用傳遞陣列傳遞

開發十年,就只剩下這套架構體系了! >>>   

C++函數的三種傳遞方式為:值傳遞、指針傳遞引用傳遞

否則 方式 指針 指向 out 數據結構 logs 形參 使用 C++函數的三種傳遞方式為:值傳遞、指針傳遞和引用傳遞 值傳遞: void fun(int x){ x += 5; //修改的只是y在棧中copy x,x只是y的一個副本,在內存中重新開辟的一塊臨時空間把y

傳遞引用傳遞

如何 nth value 引用 static st2 值傳遞 pack 修改方法 在java中如何修改方法參數的值 答案是 package myapp; import org.omg.CORBA.IntHolder; public class Test2 { pu

01PHP 引用賦值和傳遞賦值

引用 指向 地址 echo 介紹 bsp 中一 amp strong PHP中變量的引用賦值是通過&符號進行的,在這裏我們介紹下&符號引入的作用 1.先介紹下傳遞賦值 <?php $a=1; $b=3;

傳遞引用傳遞(不是引用類型的傳遞)的區別

com this static 實現 pre 對象 ffffff -c wap 值傳遞:方法調用時,實際參數把它的值傳遞給對應的形式參數,方法執行中形式參數值的改變不影響實際參數的值。引用傳遞:也稱為傳地址。方法調用時,實際參數的引用(地址,而不是參數的值)被傳遞給方法中

Java 值傳遞引用傳遞

too log test img [0 st3 tle class cnblogs 引用傳遞 示例: public class Test3 { public static void change(int []a){ a

Java String 值傳遞 VS 引用傳遞

oid 基本類 一個 span 類型 字符 this pub str 在Java代碼中,如果方法參數中有String類型,那麽這個參數是值傳遞還是方法傳遞呢? 基本類型容易理解,對象類型也容易理解,可偏偏String這個對象類型讓人有些疑惑。別著急,看完你就清晰了。 其實,

JAVA中的值傳遞引用傳遞問題

log 輸出結果 基礎知識 blue static 繼續 oid .net red   這是個老生常談的問題了,引起過無數爭論,但可以說一直沒有一個令人滿意的回答。   有人總結過: 對象是按引用傳遞的 Java 應用程序有且僅有的一種參數傳遞機制,即按值傳遞

java中參數傳遞--值傳遞引用傳遞

新的 結果 html 參數傳遞 參數 一個 程序員 java中的對象 傳參 java中的參數傳遞——值傳遞、引用傳遞 參數是按值而不是按引用傳遞的說明 Java 應用程序有且僅有的一種參數傳遞機制,即按值傳遞。 在 Java 應用程序中永遠不會傳遞對象,而只傳遞對象