Подтвердить что ты не робот

C передать указатель массива int как параметр в функцию

Я хочу передать указатель массива B int в функцию func и иметь возможность изменить его оттуда, а затем просмотреть изменения в основной функции

#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]'|

EDIT: новый код:

#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 ===|
4b9b3361

Ответ 1

В новом коде

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* (NULL). Поскольку существует правильное преобразование из void* в int, это работает, но оно не совсем кошерное, потому что преобразование является реализацией, и обычно указывает на ошибку программиста, поэтому компилятор предупреждает об этом.

int B[10] = {0};

является правильным способом для 0-инициализации a int[10].

Ответ 2

Возможно, вы пытались это сделать?

#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 say you edited only 2 and you want to show it. */
    printf("b[0] = %d\n\n", B[2]);

    return 0;
}

Ответ 3

Если вы действительно хотите передать указатель массива, это

#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;
}

Но, как упоминалось в других ответах, это не так часто, чтобы сделать это. Обычно указатель на массив передается только тогда, когда вы хотите передать двумерный массив, где он внезапно выглядит намного яснее, как показано ниже. 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] )
}

Параметр func может быть объявлен как int B[5][10], 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;
}

Ответ 4

В новом назначении кода должно быть,

B[0] = 5

В func (B) вы просто передаете адрес указателя, который указывает на массив B. Вы можете изменить функцию func() как B [i] или * (B + i). Где я - индекс массива.

В первом коде декларация говорит,

int *B[10]

говорит, что B - это массив из 10 элементов, каждый элемент которого является указателем на int. То есть B [i] является указателем на int, а * B [i] является целым числом, которое указывает на первое целое i-й сохраненной текстовой строки.

Ответ 5

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;
}

Ответ 6

В объявлении функции вы должны ввести в качестве

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