0

ランダムな値を生成する配列を作成し、その配列にポインターを割り当てて、他の関数で使用しようとしています。

質問 1: これは正しいアプローチですか?

質問 2: 以下のコードを実行すると、ポインタ関数が実際の配列の値と矛盾する値を生成します。私は何を間違っていますか?

int size = 100;
int theray[size];
for(int i=0; i<size; i++)
{
    theray[i] = (rand()%100);
}
//Output array
cout<<"The array: ";
for(int j=0; j<size; j++)
{
    cout<<theray[j]<<" ";
}
cout<<endl;

int (*parray)[100] = &theray;
cout<<"The array pointer: ";
for(int k=0; k<size; k++)
{
    cout<<*parray[k]<<" ";
}
4

4 に答える 4

3

質問 1: これは正しいアプローチですか?

いいえ。正しいアプローチは、コンパイル時に不明な場合1と、それが不明なstd::vector<int>場合2を使用することです。ここではポインタは必要ありません。sizestd::array<int, size>

void foo(const std::vector<int>& v)
{
  // do stuff with v
}

...

std::vector<int> v(size); // vector with size elements
// do something with v

// pass v to a function
foo(v);

質問 2: 以下のコードを実行すると、ポインタ関数が実際の配列の値と矛盾する値を生成します。私は何を間違っていますか?

C++ のイディオムを使用している場合、この問題に遭遇することさえないので、この質問は無意味だと思います。ただし、あなたの場合、演算子の優先順位の問題があります。*アクセス前に逆参照を適用することを明示してください[]:

cout<< (*parray)[k] << " ";

1例に示すように、std::vector実行時にサイズを知る必要がない固定サイズの配列として を使用できます。施工後のサイズ変更は可能ですのでご了承ください。

2あなたの例では、sizeはコンパイル時の定数ではないため、使用できませんstd::array。ただし、次のように宣言した場合はconst int size = 100;、コンパイル時定数と見なされます。

于 2013-03-06T07:20:33.030 に答える
2

あなたのコードは、3 つの点で少しずれています。まず、 &therayを使用する必要はありません。配列名は既にメモリ アドレスを参照しています。ポインターをtherayに割り当てるだけです。次に、100 個のポインターの配列を宣言しています。あなたの説明に基づいて、配列を指すポインターが1つだけ必要なようです。宣言は int *parray [100] ではなく int *parray にする必要があります。最後に、配列へのポインターを取得すると、配列の名前の代わりにポインターの名前のみを使用して、元の配列の場合と同じ方法で配列の要素にアクセスできます。コードの最後のブロックを変更してみてください (これへのポインタ宣言から始めます:

int *parray;
parray = theray;
cout<<"The array pointer: ";
for(int k=0; k<size; k++)
{
    cout<<parray[k]<<" ";
}
于 2013-03-06T07:32:46.600 に答える
2

質問1

これは正しいアプローチですか?

通常はありません。それはあなたが何を達成しようとしているかによって異なります。

高レベルのセマンティクスでは、ほとんどの場合std::vector<int>or を使用しますが、サイズが固定されていて C++11 を使用している場合は、std::array<int, size>. 実際にポインタ レベルまで下がらなければならない場合は、通常、次のように記述します。

int *parray = theray;
cout<<"The array pointer: ";
for(int k=0; k<size; k++)
{
    cout<<parray[k]<<" ";
}

これが機能するのは、配列がポインターに劣化し[…]、元の配列で機能するのと同じようにこれらのポインターで添字が機能するためです。

質問2

以下のコードを実行すると、ポインター関数が実際の配列の値と矛盾する値を生成します。何が間違っているのでしょうか?

*parray[k]*(parray[k])として使用するつもりですが、として解釈されます(*parray)[k]

于 2013-03-06T07:33:20.207 に答える
1

質問 1: これは正しいアプローチですか?

いいえstd::vector<>サイズが (実行時に) 動的に変化する配列に使用します。ポインターと手動のメモリ管理を避けることを好みます。

質問 2: 以下のコードを実行すると、ポインター関数が実際の配列の値と矛盾する値を生成します。私は何を間違っていますか?

まず第一に、配列を関数に渡すことができるようにポインタを作成するという事実。これは必要ありません。C++ 標準ライブラリのクラスを使用してそのプログラムを作成する方法を次に示します (C++11 で)。

#include <vector>
#include <algorithm>
#include <iostream>
#include <iterator>

// Sample function that prints the vectors's content
void foo(std::vector<int> const& v)
{
    copy(begin(v), end(v), std::ostream_iterator<int>(std::cout, " "));
}

int main()
{
    // Populate the vector...
    size_t sz = 10;
    std::vector<int> v(sz);
    generate(begin(v), end(v), [] () { return rand() % 100; });

    // Pass it to a function...
    foo(v);
}
于 2013-03-06T07:35:45.930 に答える