0

関数に渡された配列をインクリメントすることは可能ですか?

私は一次元配列 a[4] = {10,20,30,40} を持っています。関数を呼び出し、配列をインクリメントして 3 番目の要素を指し、main() から出力したいと考えています。

例:

int main()
{
  int a[4] = {10,20,30,40};
  cout << *a; // 10
  increment(); // function call
  cout << *a; // 40
}

どうすればこれを達成できますか?配列がポインターとして渡された場合、配列に格納されている値への変更のみが反映されます。関数で配列をインクリメントする必要がある場合、関数のプロトタイプは何ですか?

4

4 に答える 4

2

提案された代替手段は次のとおりです。

#include <iostream>

void foo(int *&p) // <-- take pointer by reference...
{
  ++p;
  ++p;
}

int main(void)
{
  int a[] = {1,2,3,4};

  int*p = a;

  std::cout << *p << std::endl;

  foo(p);

  std::cout << *p << std::endl;

}

2 番目のポインターを使用して元の配列にアクセスし、関数でそれを変更します...

さらに別の方法として、いずれかを使用してstd::vector<int>からstd::array<int, 4>、イテレータを関数に渡します(イテレータを返すように取得します)...

于 2012-12-03T10:57:16.823 に答える
0

現在の構文ではありません。ただし、 から新しいポインターを返し、increment()それを別の変数に格納することはできます。

int main()
{
  int a[4] = {10,20,30,40};
  cout << *a;
  int* new_a = increment(a)
  cout << *new_a;
}
于 2012-12-03T10:54:51.583 に答える
0

次の方法で、ポインターの位置にアクセスできます。

int main() {
  int a[4] = {10,20,30,40};
  cout << *a;        print ---> 10 
  cout << *(a + 3);  print ---> 40
}

情報を失うことなくやりたいことができない

于 2012-12-03T10:58:56.873 に答える
0

プログラム内のポインター a は、コンパイル時 (またはリンク時は考え方によって異なります) にプログラムのデータ空間を指します。

次のようなものがある場合

void function(int* &x) {
  x+=2;
}

int main() {
  int *a = new int(4);
  int *b = a;
  a[0] = 10; a[1] = 20; a[2] = 30; a[3] = 40;
  cout << *a;
  function(b);
  cout << *b;
  delete a;
}

GNU G++ はチェックし、ポインタ変数 a の移動を許可しません。これは、このメモリ ブロックの先頭を参照するポインタがなくなるためです。ハハハ

于 2012-12-03T11:05:40.583 に答える