2

最初は、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;
}
4

6 に答える 6

3
void f(double* h[],int n)

配列へのポインターを受け入れません。ポインターの配列を受け入れるように宣言しました。

それが機能する唯一の理由は、配列として宣言された関数パラメーターが暗黙のうちにポインターに変換されるためです。したがって、次と同等です。

void f(double** h,int n)

結局のところ、それはあなたが望んでいたものです。

この (g++ によって拒否された) コードは、配列へのポインターを使用します。

void f(double (*h)[],int n)
于 2013-07-26T20:03:19.170 に答える
1

ポインターを値渡ししたとしても、ポインターが指しているメモリは関数によって変更できます。

于 2013-07-26T20:00:14.313 に答える
1
void g(double h[],int n);

その関数では、技術的にポインターを渡しています。

void f(double* h[],int n);

ただし、これでは、ポインターを配列に渡しています。これは、関数パラメーターであるため、ポインターへのポインターに解決されます*。

*Ben Voigt の功績

于 2013-07-26T19:59:36.970 に答える