Thinking in C++: 數組指針及數組作爲函數的參數


今天我們來深入的討論一下當數組array作爲C++函數的參數的情況:

 

數組的標示符(identifier)不同於普通變量的標示符,它是一個左值(lvalue),你不能賦值給它,當你只是使用這個標示符不帶方括號時,你得到的是這個數組的首地址。

 

#include <stdafx.h>
#include <iostream>
using namespace std;

int main()
{
int a[10];
cout<<"a="<<a<<endl;
cout<<"&a[0]="<<&a[0]<<endl;
}

大家可以複製上面的程序到vs中執行一下看結果,會發現這兩個值是一樣的。

當你將一個數組作爲參數傳遞給一個函數的時候一定要特別注意:如果你聲明一個數組作爲函數參數,實際上你是聲明瞭一個指針!舉例如下:

 

#include <iostream>
#include <string>
using namespace std;
void func1(int a[], int size) {
    for(int i = 0; i < size; i++)
        a[i] = i * i - i;
}

void func2(int* a, int size) {
    for(int i = 0; i < size; i++)
        a[i] = i * i + i;

}

 

void print(int a[], string name, int size) {

for(int i = 0; i < size; i++)

cout << name << "[" << i << "] = "<< a[i] << endl;

}

 

int main() {

int a[5], b[5];

// Probably garbage values:

print(a, "a", 5);

print(b, "b", 5);

// Initialize the arrays:

func1(a, 5);

func1(b, 5);

print(a, "a", 5);

print(b, "b", 5);

// Notice the arrays are always modified:

func2(a, 5);

func2(b, 5);

print(a, "a", 5);

print(b, "b", 5);

} ///:~


儘管func1和func2聲明瞭不同的參數,但用法是一致的。這就造成了一個問題:數組不能按值傳遞!也就是當你使用數組作爲參數的時候,你不能自動得到一份本地的數組副本,數組總是引用傳遞。

 

 

 

發佈了95 篇原創文章 · 獲贊 10 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章