Thinking in C+:配列ポインタおよび配列を関数とするパラメータ
今日は、配列arrayがC++関数のパラメータとして使用される場合について深く議論します.
配列の識別子(identifier)は通常の変数の識別子とは異なり、左値(lvalue)であり、値を割り当てることはできません.この識別子を使用して角カッコを持たない場合、この配列の最初のアドレスが得られます.
上記のプログラムをvsにコピーして結果を見ると、この2つの値は同じであることがわかります.
配列をパラメータとして関数に渡すときは、配列を関数パラメータとして宣言すると、実際にポインタを宣言します.例を次に示します.
func 1とfunc 2は異なるパラメータを宣言しているが、使用方法は一致している.これにより、配列が値で伝達されないという問題が発生しました.つまり、パラメータとして配列を使用すると、ローカルの配列コピーを自動的に取得することはできません.配列は常に伝達を参照します.
配列の識別子(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は異なるパラメータを宣言しているが、使用方法は一致している.これにより、配列が値で伝達されないという問題が発生しました.つまり、パラメータとして配列を使用すると、ローカルの配列コピーを自動的に取得することはできません.配列は常に伝達を参照します.