Я думаю, вы неправильно поняли указатели.Проблема вашего кода заключается в том, что вы не понимаете, что указатель также «передается по значению», указатель в функции - это другая переменная в стеке, а не та, которую вы объявляете в основной функции.
Я бы использовал более простой пример, но идея та же.
void changePointerValue (int * ptr)
{
int newValue = 10;
ptr = &newValue;
}
int main ()
{
int x = 20;
int * ptr = &x;
changePointerValue (ptr);
printf ("After Change: %d\n", *ptr);
}
Какое значение, по вашему мнению, будет выводиться в основной функции?Это будет 10?
Но нет, на самом деле, он выдаст 20.
Почему?Давайте посмотрим, что делает наш код.В строке chagePointerValue (ptr) компьютер скопирует значение ptr в основной функции в новое переменное в стеке, назовем его ptr 'и передадим его в функцию changePointerValue.
Таким образом, фактически ptr в функции changePointerValue - это ptr ', а не тот, который вы объявляете в основной функции.Во второй строке changePointerValue вы назначили новый адрес памяти для ptr ', а после этого ptr' отбрасывается, потому что функция возвращается.Значение ptr в основной функции остается тем же значением, то есть адресом памяти, указанным на x.
Если вы хотите, чтобы вывод был равен 10, вам нужно задавать ptr в changePointerValue, и назначение будет означать «Изменитьзначение, на которое указывает ptr '.
void changePointerValue (int * ptr)
{
int newValue = 10;
*ptr = newValue; // Now you are change the content of the memroy cell where ptr is pointed at.
}
int main ()
{
int x = 20;
int * ptr = &a;
printf ("Before Change:%d", x); // 20
printf ("Before Change:%d", *ptr); // 20
changePointerValue (ptr);
printf ("After Change: %d\n", *ptr); // 10
printf ("After Change: %d\n", x); //10
}
Редактировать:
Итак, если вы хотите, чтобы в основной функции было напечатано 10, правильный способ сделать этоуважение ptr в функции.Но это также изменит значение переменной a в главной функции.
int one(int ***ptr)
{
***ptr=10; // Dereference ptr to where it points to. (Varaible a in the main function)
return 32;
}
int main(int argc, char *argv[])
{
static int ***ptr;
int a=200,*b,**c;
int result;
b=&a;
c=&b;
ptr=&c;
printf("Main Ptr:%d\n",&ptr); // The memory address of variable ptr.
result=one(ptr);
printf("Main Ptr:%d\n",&ptr); // the memory address of variable ptr.
printf("Main Ptr:%d\n",***ptr); // 10
printf("Main a:%d\n", a); // 10
printf("Main result:%d\n", result); //32
system("PAUSE");
return 0;
}