Указатели переключателя в функции на языке программирования C

Как Вы переключаете указатели в функцию?

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;
}
7
задан Prasoon Saurav 29 December 2009 в 04:26
поделиться

7 ответов

В языке 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*/
14
ответ дан 6 December 2019 в 05:08
поделиться

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

2
ответ дан 6 December 2019 в 05:08
поделиться

Пожалуйста, смотрите здесь по другому аналогичному вопросу, как это объяснено. Как только вы прочтете это, вам будет легче понять другие ответы, приведенные выше.

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

1
ответ дан 6 December 2019 в 05:08
поделиться

Вы изменяете локальные значения указателя внутри функции - после выхода из нее эти изменения не сохраняются. Если вы хотите изменить значения, на которые указывают указатели, то вы хотите:

int intP3; /* local for swap */
intP3 = *p_intP2;
*p_intP2 = *p_intP1;
*p_intP1 = intP3;

Если вы хотите изменить значения самих указателей (например, адреса), то вы должны передать указатели этим указателям, а не самим указателям.

.
2
ответ дан 6 December 2019 в 05:08
поделиться

Измените сигнатуру, чтобы взять указатель на указатель.

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)
5
ответ дан 6 December 2019 в 05:08
поделиться

Вам нужен указатель на указатель.

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;
}
13
ответ дан 6 December 2019 в 05:08
поделиться

Если вы хотите переключить указатели, то вам нужно вставить адреса указателей, а не значения указателей:

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;
}
1
ответ дан 6 December 2019 в 05:08
поделиться