Как Вы переключаете указатели в функцию?
void ChangePointers(int *p_intP1, int *p_intP2);
int main() {
int i = 100, j = 500;
int *intP1, *intP2; /* pointers */
intP1 = &i;
intP2 = &j;
printf("%d\n", *intP1); /* prints 100 (i) */
printf("%d\n", *intP2); /* prints 500 (j) */
ChangePointers(intP1, intP2);
printf("%d\n", *intP1); /* still prints 100, would like it swapped by now */
printf("%d\n", *intP2); /* still prints 500 would like it swapped by now */
}/* end main */
void ChangePointers(int *p_intP1, int *p_intP2) {
int *l_intP3; /* local for swap */
l_intP3 = p_intP2;
p_intP2 = p_intP1;
p_intP1= l_intP3;
}
В языке C параметры всегда передаются значениями. Несмотря на то, что внутри вызываемой функции изменяются значения указательных переменных, изменения не отражаются обратно на вызывающую функцию. Попробуйте сделать это:
void ChangePointers(int **p_intP1, int **p_intP2); /*Prototype*/
void ChangePointers(int **p_intP1, int **p_intP2) /*Definition*/
{
int *l_intP3; /* local for swap */
l_intP3 = *p_intP2;
*p_intP2 = *p_intP1;
*p_intP1= l_intP3;
}
Соответствующий вызов из main() должен быть:
ChangePointers(&intP1, &intP2);/*Passing in the address of the pointers instead of their values*/
В дополнение ко всем этим ответам, я просто хотел добавить, что когда у меня возникали проблемы с пониманием указателей в такой ситуации, я сводил их к чему-то более простому, например, int. Скажем, если бы вы передавали int в функцию:
int x = 10;
change_int(x);
printf("%d",x);
void change_int(int y)
{
y = 20;
}
x, очевидно, все равно бы напечатал 10. Чтобы изменить x, нужно передать указатель на x, чтобы можно было изменить x напрямую.
int x = 10;
change_int(&x);
printf("%d",x);
void change_int(int *y)
{
*y = 20;
}
x выведет 20. Теперь просто применим эту же логику, как если бы x был указателем, то нужно передать двойной указатель. Надеюсь, это поможет.
Пожалуйста, смотрите здесь по другому аналогичному вопросу, как это объяснено. Как только вы прочтете это, вам будет легче понять другие ответы, приведенные выше.
Надеюсь, это поможет, С наилучшими пожеланиями, Том.
Вы изменяете локальные значения указателя внутри функции - после выхода из нее эти изменения не сохраняются. Если вы хотите изменить значения, на которые указывают указатели, то вы хотите:
int intP3; /* local for swap */
intP3 = *p_intP2;
*p_intP2 = *p_intP1;
*p_intP1 = intP3;
Если вы хотите изменить значения самих указателей (например, адреса), то вы должны передать указатели этим указателям, а не самим указателям.
.Измените сигнатуру, чтобы взять указатель на указатель.
void ChangePointers(int **p_intP1, int **p_intP2) {
int *l_intP3; /* local for swap */
l_intP3 = *p_intP2;
*p_intP2 = *p_intP1;
*p_intP1= l_intP3;
}
Или, если вы хотите, чтобы код вызова выглядел так же, как и ссылки на C++, используйте макрос.
void ChangePointersImpl(int **p_intP1, int **p_intP2) {
int *l_intP3; /* local for swap */
l_intP3 = *p_intP2;
*p_intP2 = *p_intP1;
*p_intP1= l_intP3;
}
#define ChangePointers(a,b) ChangePointersImpl(&a, &b)
Вам нужен указатель на указатель.
ChangePointers(&intP1, &intP2);
void ChangePointers(int **p_intP1, int **p_intP2) {
int *l_intP3;
l_intP3 = *p_intP2;
*p_intP2 = *p_intP1;
*p_intP1 = l_intP3;
}
Если вы хотите переключить указатели, то вам нужно вставить адреса указателей, а не значения указателей:
void ChangePointers(int **p_intP1, int **p_intP2) {
int *l_intP3; /* local for swap */
l_intP3 = *p_intP2;
*p_intP2 = *p_intP1;
*p_intP1= l_intP3;
}