起初我猜想k1的值不会在主空间中.但后来我意识到数组是一个指针,所以有什么区别吗?我认为这是相同的,但也许任何人都可以找到一些其他的技术差异.也许更快地传递指针?
#include <iostream>
using namespace std;
void g(double [],int );
void f(double* [],int );
int main()
{
int n = 10;
double *k1, *k2;
k1 = new double[n];
k2 = new double[n];
g(k1,n);
f(&k2,n);
for(int i = 0;i <n;i++)
{
cout << k1[i]<< " ";
cout << k2[i] << endl;
}
delete [] k1;
delete [] k2;
return 0;
}
void g(double h[],int n)
{
for(int i = 0;i <n;i++)
h[i]=i;
}
void f(double* h[],int n)
{
for(int i = 0;i <n;i++)
(*h)[i]=i;
}
Run Code Online (Sandbox Code Playgroud)
首先,数组不是指针.这是10个双打的数组:
double a[10];
Run Code Online (Sandbox Code Playgroud)
这是一个指向double的指针:
double *p;
Run Code Online (Sandbox Code Playgroud)
这是一个指向10个双精度数组的指针:
double (*pa)[10];
Run Code Online (Sandbox Code Playgroud)
这是一个双打指针数组:
double *pa[10];
Run Code Online (Sandbox Code Playgroud)
声明为函数参数时,数组和指针只是相同的.但是数组可以转换(衰减)成指向数组的第一个元素的指针:
double a[10];
double *p = a;
double *q = &a[0]; //same as p
Run Code Online (Sandbox Code Playgroud)
在您的示例代码中:
double *x = new double[10];
Run Code Online (Sandbox Code Playgroud)
您正在创建一个包含10个双精度数的动态数组,并获取指向该数组的第一个元素的指针.您还可以创建一个新数组并获取指向数组的指针:
double (*x)[10] = new double (*)[10];
Run Code Online (Sandbox Code Playgroud)
但这种奇怪的语法表现很少有用.
关于函数,这是一个带有双精度数组的函数:
void g1(double h[], int n);
Run Code Online (Sandbox Code Playgroud)
这是一个函数,指向10个双精度数组的指针:
void g2(double (*h)[10]);
Run Code Online (Sandbox Code Playgroud)
在指向数组的指针的情况下,您需要指定数组的大小,因为您无法创建指向未知大小数组的指针.
这就是为什么数组实际上作为指针传递给函数的原因.但是指向数组的第一个成员的指针,而不是指向数组本身的指针.所以第一个函数实际上与这个函数相同:
void g1(double *h, int n);
Run Code Online (Sandbox Code Playgroud)
由于您只将指针传递给数组的第一个成员(指向double的指针),因此您还需要在附加参数中指定数组的大小.优点是您可以传递任何大小的数组.甚至是阵列的拼接:
double x[20];
g1(x + 10, 5); //pass x[10..15]
Run Code Online (Sandbox Code Playgroud)
关于哪一个更快,它们都是相同的,它们实际上是指向相同内存地址的指针.请注意,如果数组是结构的一部分,则只通过副本传递,并且结构按值传递.
我的建议是:如果你使用C棒到惯用的C,必要时使用指向数组第一个成员的指针,并尽可能避免使用指针到数组的语法.如果使用C++,则使用容器,迭代器和范围.