Если вам не нравятся указатели на указатели, вы всегда можете изменить сигнатуру функции, чтобы она возвращала новое значение указателя для присвоения A и вместо этого устанавливала значение измерения с помощью указателя:
[...]
int dimension;
int * A = cargaArreglo(&dimension);
[...]
int * cargaArreglo(int * retDimension){
int i = 0;
char bandera = 's';
int * B = malloc( 1*sizeof(int) );
while( bandera != 'n' ){
printf( "Ingrese un numero" );
scanf( "%d", &B[i] );
printf( "Desea seguir ingresando?" );
i++;
fflush( stdout ); /* fflush( stdin ) is UB */
scanf( "%c", &bandera );
if( bandera != 'n' )
B = realloc( B, (i+1)*sizeof(int) );
}
*retDimension = i;
return B;
}
Я имею в виду, учитель сказал, что это невозможно, потому что без двойного указателя я не могу изменить значение глобальной переменной. Это заставило меня запутаться в отношении указателей.
Учитель имел в виду, что когда вы вызываете функцию на C, временная копия каждого аргумента помещается в стек для использования внутри функции. Поэтому, если вы измените значение аргумента внутри вызываемой функции, оно не изменит значение обратно в вызывающей функции... например, запустив этот код:
void foo(int x, int * A)
{
x = 6;
A = NULL;
}
int x = 5;
int * A = &x;
printf("BEFORE x=%i A=%p &x=%p\n", x, A, &x);
foo(x, A);
printf("AFTER x=%i A=%p &x=%p\n", x, A, &x);
... выведет:
BEFORE x=5 A=0x2345678 &x=0x2345678
AFTER x=5 A=0x2345678 &x=0x2345678
... что означает, что foo() на самом деле не изменил значение ни x, ни A в вызывающей функции, потому что foo() изменил только копию x и копию A, которые были переданы ему, а не исходные переменные.
Однако foo() может использовать указатель A для (косвенного) изменения значения x вызывающей функции, потому что копия A функции по-прежнему указывает на x вызывающей функции, поэтому вы можете реализовать foo для этого :
void foo(int * A)
{
*A = 666;
}
int x = 5;
printf("BEFORE x=%i\n", x);
foo(&x);
printf("AFTER x=%i\n", x);
... и вы получите этот вывод:
BEFORE x=5
AFTER x=666
... и если вышеизложенное имеет для вас смысл, то случай указателя на указатель на самом деле точно такой же, как и выше, за исключением того, что вместо A, указывающего на int, тип значения, на которое он указывает указатель:
void foo(int ** x)
{
*x = NULL;
}
int y = 5;
int * x = &y;
int ** A = &x;
printf("BEFORE x=%p\n", x);
foo(A);
printf("AFTER x=%p\n", x);
... распечатает:
BEFORE x=0x2345845 (actual value will vary depending on your computer)
AFTER x=NULL
person
Jeremy Friesner
schedule
18.05.2016
fflush( stdin );
— это неопределенное поведение. - person Lundin   schedule 18.05.2016main()
, являются локальными переменными этой функции. - person John Bollinger   schedule 18.05.2016