1

配列内のすべての正の数を合計する関数を持つプログラムを作成する必要がありましたが、関数パラメーター配列をポインターとして使用していました。sum関数を呼び出そうとすると、メイン関数で問題が発生します。ここに私のソースコードがあります:

#include <stdio.h>
#include <conio.h>
int posit(int *x[], int n){
  int s=0;
  for(int i=0; i<n; i++){
    if(*x[i]>0){
      s=s+*x[i];
    }
  }
  return s;
}
int main(){
  int k;
  scanf("%d",&k);
  int a[k];
  for(int i=0; i<k; i++){
    scanf("%d",&a[i]);
  }
  int b=posit(&a,k);
  printf("%d\n", b);
  getch();
  return 0;
}
4

3 に答える 3

5

配列が関数に渡されると、最初の要素へのポインターに減衰します。関数のシグネチャを次のように変更します。

int posit(int* x, int n){ /* Equivalent to 'int posit(int x[], int n)' */

関数内の配列の要素アクセス構文を*x[i]から just に変更しx[i]ます。関数を呼び出す:

int b=posit(a,k);

scanf()言及する価値のあるもう 1 つのポイントは、行われた割り当ての数を返す の戻り値をチェックして、&a[i]が実際に割り当てられていること、およびプログラムがその後初期化されていない変数を使用していないことを確認することです。

C FAQのArrays and Pointersセクションが役に立つかもしれません。

于 2012-11-15T10:17:25.363 に答える
1

実際にあなたの例では、ポインタからポインタへの関数に渡しています(同様の表記法が main 引数で頻繁に使用されることに注意してくださいchar *argv[])。

hmjd の投稿で述べたように、配列を関数に渡している間、これは最初の要素のアドレスに変換されます。ポインタ ( ) を明示的に使用する代わりに、int *x配列表記 (int[]または) を使用することもできますint[k]が、それらは同じです。

int[k]また、2 番目の方法 ( ) で提供されるサイズは問題ではなく、関数内では不明であることにも注意してください。これは、多次元配列を扱う場合にのみサイズを含めることが重要ですが、これは別の話です...

于 2012-11-15T10:36:26.473 に答える
0

K&R2より

When an array name is passed to a function, what is passed is the 
location of the initial element. Within the called function, this 
argument is a local variable, and so an array name parameter is a 
pointer, that is, a variable containing an address.

したがって、最初の要素のみを関数に渡します。

これを理解したら、ソースを次のように変更できます

int posit(int *x, int n)

この関数をメインから呼び出すには、次を使用できます

int b=posit(a,k); //Note only the location of the first element is being passed

于 2012-11-15T11:01:51.630 に答える