无聊随便写写的,不知道对不对。
int arr[5] = {1,2,3,4,5};
int *p = arr;
一 数组名是常量地址
C++将数组名解释为数组的第一个元素的地址即 arr == &arr[0]
而且数组名是一个常量,貌似这也是为什么数组不能赋值的原因(我瞎猜的)。
#include <iostream>
using namespace std;
int main()
{
int arr[5] = {1,2,3,4,5};
cout << arr << endl;
cout << &arr[0] << endl;
return 0;
}
0x6efeec
0x6efeec
二 特殊情况
在使用sizeof运算符的时候,C++不会将数组解释为地址。
而且求出数组占用的空间。
int arr[5] = {1,2,3,4,5};
cout << sizeof arr << endl;
运行结果如下:
20
其他的时候数组和指针可以交替使用
NOTE:数组名是数组第一个元素的地址,所以指向数组名的指针跟数组元素的类型相匹配。
例如:
#include <iostream>
using namespace std;
int main()
{
int arr[5] = {1,2,3,4,5};
int *p = arr;
for (int i = 0; i < 5; i++)
cout << p[i] << ' ';cout << endl;
for (int i = 0; i < 5; i++)
arr[i] = 1000 + i;
for (int i = 0; i < 5; i++)
cout << *(p + i) << ' ';cout << endl;
return 0;
}
运行结果如下:
1 2 3 4 5
1000 1001 1002 1003 1004
在函数中操作数组(吧)
由于数组不能值传递,所以函数的参数类型和返回类型不可能存在数组的。
但是在函数中使用数组,是肛刚需。
我们想一想,当创建一个数组的时候我们声明(定义)了哪些细节:
int arr[5];
int numbers[5] = {1,2,3,4,5};
- 数组的类型
- 数组的大小
由于,指针可以作为数组名的"完美"替代品。所以,通常使用指针,传递数组。
void show(int * p, int length)
{
using std::endl;
using std::cout;
cout << "print array:\n";
for (int i = 0; i < length; i++)
cout << p[i] << ' ';
cout << endl;
}
NOTE:指针只能知道数组的地址,但是不知道数组的大小,所以需要一个length变量告诉函数数组的size。
当然,如果你非常不喜欢使用指针,也可使使用其他的方法。比如将数组放结构(体)中,将结构作为函数参数传递信息。结构体支持值传递,可以作为函数参数传递信息。
BUT,你用脑子想一想,值传递效率高,还是指针效率高?
补充
有时候为了区分传递“数组”和指针,以及书写方便,通常将参数列表写成如下形式:
void show(int p[], int length);
这种写法只能在函数的参数列表里面写,他的本质上还是指针。
网友评论