指针与数组的区别(当然是说C++啦)

2018-06-10  本文已影响0人  百工之人

无聊随便写写的,不知道对不对。

  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};
  1. 数组的类型
  2. 数组的大小

由于,指针可以作为数组名的"完美"替代品。所以,通常使用指针,传递数组。

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);

这种写法只能在函数的参数列表里面写,他的本质上还是指针。

上一篇 下一篇

猜你喜欢

热点阅读