1

だから私は今Cを学ぼうとしています.2つの関数があります.1つは配列内の要素をシフトします.

void shift(int a[], int n) {
   int i;
   for(i = 0; i != n-1; i++){
      a[i] = a[i+1];
   }
}

およびポインターベースを除く、同じ関数のバージョン:

void pointer_shift(int *a[], int n) {
   int i;
   for (i = 0; i != n - 1; i++) {
      *a[i] = *a[i + 1];
   }
}

ポインターベースのバージョンが正しいかどうかはわかりませんが、最も重要な質問は、両方/どちらかが機能することを実際にテストする方法だと思います。これら 2 つの関数の定義に加えて、次のものがあります。

#include <stdio.h>

void shift(int a[], int n);
void pointer_shift(int *a[], int n);

int main(void) {
    printf("Begin execution of testing Problem 1\n");
    int a1[] = {100, 101, 102};
    int i;
    for(i = 0; i<3;i++)
        printf("Before Shift: " "%d\n", a1[i]);
    //shift(a1, 3);
    pointer_shift(&a1, 3);
    for(i = 0; i<3;i++)
        printf("After Shift In Main: " "%d\n", a1[i]);
    return 0;
}

シフト(a1, 3)

正常に動作しますが、私は一生、pointer_shift を正しくテストする方法を理解できません。

2 つのエラーが発生します。1つはその行にあります

pointer_shift(&a1, 3)

互換性のないポインター型から引数 1 を渡しています。他のエラーは判読できませんが、誰かが私を助けることができるほど問題が明らかであることを望んでいました. だから...私のメインで私の2つの機能をテストする方法は?

ありがとう!

4

4 に答える 4

3

ポインターベースの関数を次のように変更します。

void pointer_shift(int *a, int n) {
   int i;
   for (i = 0; i != n - 1; i++) {
      *(a+i) = *(a+i+1);
   }
}

から配列を渡すのに対し、受け取っているのはポインターの配列ですmain。配列はポインターに分解されるため、ここでは呼び出しshift(a1, 3)で十分です。

于 2012-09-09T09:10:05.423 に答える
2

関数プロトタイプを変更して、int*

void pointer_shift(int *a, int n) 

そして、このような配列要素にアクセスします

*(a+1) = 4;

これはと同じです

a[1] = 4;

関数にパラメーターとして渡されると、配列は最初の要素へのポインターに減衰するため、配列変数を使用して同じ方法で呼び出すことができます

于 2012-09-09T09:12:49.003 に答える
0
int main(void) {
    printf("Begin execution of testing Problem 1\n");
    int a1[] = {100, 101, 102};
    int *array_of_pointers[3];
    int i;

   array_of_pointers[0]= &a1[0];
   array_of_pointers[1]= &a1[1];
   array_of_pointers[2]= &a1[2];

   for(i = 0; i<3;i++)
       printf("Before Shift: " "%d %p\n ", a1[i], array_of_pointers[i]);

/*
  same as passing a1, the address of the array is
  the same value as the value of the array, just a different type
*/
   pointer_shift(array_of_pointers, 3);
   printf("After Shift, note that array_of_pointers has not shifted:\n");
   for(i = 0; i<3;i++)
       printf("After Shift In Main: " "%d %p\n", a1[i], array_of_pointers[i]);
   return 0;
}

pointer_shift は、int の配列ではなく、ポインターの配列を想定しています。ここでの「シフト」は配列ではなく、配列内の要素が指している値であり、配列の要素の値は同じままです!

于 2012-09-09T09:27:58.087 に答える
-1

最初の関数はすでにポインタベースです。型の関数パラメーターを定義するint[]と、コンパイラーはそれをポインター型を定義した場合と同じように扱いますint*。したがって、関数にはポインターまたは配列(ポインターに自動的にキャストされます)のいずれかを渡すことができます。

関数プロトタイプをint *aの代わりに受け入れるように変更するint a[]と、関数はまったく同じように機能します。

2番目の関数は、intへのポインターの配列を予期しているため、機能しません。これは、必要なものではありません。

于 2012-09-09T09:20:10.880 に答える