31

B int 配列ポインターを func 関数に渡し、そこから変更して、main 関数の変更を表示できるようにしたい

#include <stdio.h>

int func(int *B[10]){

}

int main(void){

    int *B[10];

    func(&B);

    return 0;
}

上記のコードでは、いくつかのエラーが発生します。

In function 'main':|
warning: passing argument 1 of 'func' from incompatible pointer type [enabled by default]|
note: expected 'int **' but argument is of type 'int * (*)[10]'|

編集: 新しいコード:

#include <stdio.h>

int func(int *B){
    *B[0] = 5;
}

int main(void){

    int B[10] = {NULL};
    printf("b[0] = %d\n\n", B[0]);
    func(B);
    printf("b[0] = %d\n\n", B[0]);

    return 0;
}

今、私はこれらのエラーを受け取ります:

||In function 'func':|
|4|error: invalid type argument of unary '*' (have 'int')|
||In function 'main':|
|9|warning: initialization makes integer from pointer without a cast [enabled by default]|
|9|warning: (near initialization for 'B[0]') [enabled by default]|
||=== Build finished: 1 errors, 2 warnings ===|
4

9 に答える 9

41

新しいコードでは、

int func(int *B){
    *B[0] = 5;
}

Bは へのポインタであるためint、でB[0]ありint、 を逆参照することはできませんint。、を削除するだけ*です

int func(int *B){
    B[0] = 5;
}

そしてそれは動作します。

初期化では

int B[10] = {NULL};

を( ) で初期化しintています。からへの有効な変換があるため、それは機能しますが、変換は実装定義であり、通常はプログラマーによる間違いを示しているため、コンパイラーはそれについて警告します。void*NULLvoid*int

int B[10] = {0};

を 0 で初期化する適切な方法int[10]です。

于 2012-12-05T19:33:44.637 に答える
11

多分あなたはこれをやろうとしていたのですか?

#include <stdio.h>

int func(int * B){

    /* B + OFFSET = 5 () You are pointing to the same region as B[OFFSET] */
    *(B + 2) = 5;
}

int main(void) {

    int B[10];

    func(B);

    /* Let's say you edited only 2 and you want to show it. */
    printf("b[0] = %d\n\n", B[2]);

    return 0;
}
于 2012-12-05T19:22:26.190 に答える
7

実際に配列ポインタを渡したい場合は、

#include <stdio.h>

void func(int (*B)[10]){   // ptr to array of 10 ints.
        (*B)[0] = 5;   // note, *B[0] means *(B[0])
         //B[0][0] = 5;  // same, but could be misleading here; see below.
}

int main(void){

        int B[10] = {0};   // not NULL, which is for pointers.
        printf("b[0] = %d\n\n", B[0]);
        func(&B);            // &B is ptr to arry of 10 ints.
        printf("b[0] = %d\n\n", B[0]);

        return 0;
}

しかし、他の回答で述べたように、これを行うことはそれほど一般的ではありません。通常、配列へのポインターは、2 次元配列を渡したい場合にのみ渡されます。以下のように、2 次元配列が突然より明確に見えます。2D 配列は、実際には最初の行へのポインターとして渡されます。

void func( int B[5][10] )  // this func is actually the same as the one above! 
{
         B[0][0] = 5;
}

int main(void){
    int Ar2D[5][10];
    func(Ar2D);   // same as func( &Ar2D[0] )
}

int B[5][10]func のパラメーターは、int B[][10]、 、として宣言int (*B)[10]できます。すべてパラメーターの型として同等です。

補遺: 関数から配列へのポインターを返すことはできますが、関数を宣言する構文は非常に扱いにくく、型の [10] 部分はパラメーター リストの後に配置する必要があります。

int MyArr[5][10];
int MyRow[10];

int (*select_myarr_row( int i ))[10] { // yes, really
   return (i>=0 && i<5)? &MyArr[i] : &MyRow;
}

これは通常、目の疲れを避けるために次のように行われます。

typedef int (*pa10int)[10];

pa10int select_myarr_row( int i ) {
   return (i>=0 && i<5)? &MyArr[i] : &MyRow;
}
于 2013-12-13T15:28:39.970 に答える
1

新しいコードの割り当てでは、

B[0] = 5

func(B) では、配列 B を指しているポインターのアドレスを渡しているだけです。 func() で B[i] または *(B + i) として変更できます。ここで、i は配列のインデックスです。

最初のコードでは、宣言は次のように述べています。

int *B[10]

B は 10 個の要素の配列であり、その各要素は int へのポインターであると言います。つまり、B[i] は int ポインターであり、*B[i] は i 番目の保存されたテキスト行の最初の整数を指す整数です。

于 2012-12-05T19:33:13.703 に答える
0
main()
{
    int *arr[5];
    int i=31, j=5, k=19, l=71, m;

    arr[0]=&i;
    arr[1]=&j;
    arr[2]=&k;
    arr[3]=&l;
    arr[4]=&m;

    for(m=0; m<=4; m++)
    {
        printf("%d",*(arr[m]));
    }
    return 0;
}
于 2014-05-13T06:18:25.807 に答える
-2

関数宣言では、次のように入力する必要があります

VOID FUN(INT *a[]);
/*HERE YOU CAN TAKE ANY FUNCTION RETURN TYPE HERE I CAN TAKE VOID AS THE FUNCTION RETURN  TYPE FOR THE FUNCTION FUN*/
//IN THE FUNCTION HEADER WE CAN WRITE AS FOLLOWS
void fun(int *a[])
//in the function body we can use as
a[i]=var
于 2014-12-14T13:06:01.070 に答える