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にコピーして結果を見ると、この2つの値は同じであることがわかります.
配列をパラメータとして関数に渡すときは、配列を関数パラメータとして宣言すると、実際にポインタを宣言します.例を次に示します.
 
#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);

} ///:~


func 1とfunc 2は異なるパラメータを宣言しているが、使用方法は一致している.これにより、配列が値で伝達されないという問題が発生しました.つまり、パラメータとして配列を使用すると、ローカルの配列コピーを自動的に取得することはできません.配列は常に伝達を参照します.