猿问

使用函数更改指针包含的地址

使用函数更改指针包含的地址

如果我声明了一个指针pint *p;在主模块中,我可以更改p通过分配p=&a;哪里a是另一个已声明的整数变量。我现在想通过使用如下函数来更改地址:

void change_adrs(int*q){
    int *newad;
    q=newad;}

如果我从主模块调用这个函数

int main(){
    int *p;
    int a=0;
    p=&a; // this changes the address contained by pointer p
    printf("\n The address is %u ",p);
    change_adrs(p);
    printf("\n the address is %u ",p); // but this doesn't change the address
    return 0;}

地址内容不变。在相同的任务中使用函数有什么问题?


胡说叔叔
浏览 591回答 3
3回答

噜噜哒

在C中,函数参数是通过值传递的。因此,将对参数进行复制,并对该副本进行更改,而不是希望看到修改的实际指针。您将需要更改您的函数以接受双指针参数,如果要这样做,则对取消引用的参数进行更改。例如 void foo(int** p) {       *p = 0;  /* set pointer to null */  }  void foo2(int* p) {       p = 0;  /* makes copy of p and copy is set to null*/  }  int main() {      int* k;      foo2(k);   /* k unchanged */      foo(&k);   /* NOW k == 0 */  }如果您可以使用C+,另一种方法是更改函数以接受对指针的引用。

繁星coding

在C中,变量通过值传递-指针的副本传递给函数。使用指向指针的另一个指针:void change(int **p, int *someOtherAddress){     *p = someOtherAddress;}int a = 1, b = 2;int *p = &a;printf("*p = %d\n", *p);change(&p, &b);printf("*p = %d\n", *p);这个指纹*p = 1 *p = 2

九州编程

如果您想在C中修改函数中变量的内容,指针也是一个变量,您必须传递它。指针或间接参考总是用&地址和*去引用操作符。我是说*在更改变量的值时,始终使用运算符并将其放在前面。#include&nbsp;<stdio.h>#include&nbsp;<stdlib.h>void&nbsp;changeIntVal(int&nbsp;*x)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;*x&nbsp;=&nbsp;5;}void&nbsp;changePointerAddr(int&nbsp;**q)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;*newad; &nbsp;&nbsp;&nbsp;&nbsp;*q&nbsp;=&nbsp;newad;}void&nbsp;changePPAddr(int&nbsp;***q)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;**dummy; &nbsp;&nbsp;&nbsp;&nbsp;*q&nbsp;=&nbsp;dummy;}int&nbsp;main()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;*p; &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;**pp; &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;*tempForPP; &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;a&nbsp;=&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;printf("\n&nbsp;The&nbsp;address&nbsp;pointing&nbsp;by&nbsp;p&nbsp;->&nbsp;%p,&nbsp;pp&nbsp;->&nbsp;%p,&nbsp;value&nbsp;of&nbsp;a&nbsp;->&nbsp;%d&nbsp;",&nbsp;p,&nbsp;pp,&nbsp;a); &nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;=&nbsp;&a; &nbsp;&nbsp;&nbsp;&nbsp;pp&nbsp;=&nbsp;&tempForPP; &nbsp;&nbsp;&nbsp;&nbsp;printf("\n&nbsp;The&nbsp;address&nbsp;pointing&nbsp;by&nbsp;p&nbsp;->&nbsp;%p,&nbsp;pp&nbsp;->&nbsp;%p,&nbsp;value&nbsp;of&nbsp;a&nbsp;->&nbsp;%d&nbsp;",&nbsp;p,&nbsp;pp,&nbsp;a); &nbsp;&nbsp;&nbsp;&nbsp;changeIntVal(&a);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;---- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;|--- &nbsp;&nbsp;&nbsp;&nbsp;changePointerAddr(&p);&nbsp;&nbsp;&nbsp;//&nbsp;----&nbsp;&nbsp;|---->&nbsp;&nbsp;parts&nbsp;of&nbsp;what&nbsp;I&nbsp;mean &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;|--- &nbsp;&nbsp;&nbsp;&nbsp;changePPAddr(&pp);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;---- &nbsp;&nbsp;&nbsp;&nbsp;printf("\n&nbsp;The&nbsp;address&nbsp;pointing&nbsp;by&nbsp;p&nbsp;->&nbsp;%p,&nbsp;pp&nbsp;->&nbsp;%p,&nbsp;value&nbsp;of&nbsp;a&nbsp;->&nbsp;%d&nbsp;",&nbsp;p,&nbsp;pp,&nbsp;a); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;}
随时随地看视频慕课网APP
我要回答