Thinking in C++: 数组指针及数组作为函数的参数
今天我们来深入的讨论一下当数组array作为C++函数的参数的情况:
数组的标示符(identifier)不同于普通变量的标示符,它是一个左值(lvalue),你不能赋值给它,当你只是使用这个标示符不带方括号时,你得到的是这个数组的首地址。
[cpp]
#include <stdafx.h>
#include <iostream>
using namespace std;
int main()
{
int a[10];
cout<<"a="<<a<<endl;
cout<<"&a[0]="<<&a[0]<<endl;
}
#include <stdafx.h>
#include <iostream>
using namespace std;
int main()
{
int a[10];
cout<<"a="<<a<<endl;
cout<<"&a[0]="<<&a[0]<<endl;
}大家可以复制上面的程序到vs中执行一下看结果,会发现这两个值是一样的。
当你将一个数组作为参数传递给一个函数的时候一定要特别注意:如果你声明一个数组作为函数参数,实际上你是声明了一个指针!举例如下:
[cpp]
#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;
}
#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;
}[cpp]
void func2(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;[cpp] view plaincopyprint?
<SPAN style="FONT-FAMILY: Courier; FONT-SIZE: 12px"><SPAN style="FONT-FAMILY: Courier; FONT-SIZE: 12px"></SPAN></SPAN><P align=left>}</P><P align=left> </P><P align=left>void print(int a[], string name, int size) {</P><P align=left> for(int i = 0; i < size; i++)</P><P align=left> cout << name << "[" << i << "] = "<< a[i] << endl;</P><P align=left>}</P><P align=left> </P><P align=left>int main() {</P><P align=left> int a[5], b[5];</P><P align=left> // Probably garbage values:</P><P align=left> print(a, "a", 5);</P><P align=left> print(b, "b", 5);</P><P align=left> // Initialize the arrays:</P><P align=left> func1(a, 5);</P><P align=left> func1(b, 5);</P><P align=left> print(a, "a", 5);</P><P align=left> print(b, "b", 5);</P><P align=left> // Notice the arrays are always modified:</P><P align=left> func2(a, 5);</P><P align=left> func2(b, 5);</P><P align=left> print(a, "a", 5);</P><P align=left> print(b, "b", 5);</P><P>} ///:~</P>
} 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声明了不同的参数,但用法是一致的。这就造成了一个问题:数组不能按值传递!也就是当你使用数组作为参数的时候,你不能自动得到一份本地的数组副本,数组总是引用传递。
补充:软件开发 , C++ ,