为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C
胡说叔叔 2019-07-03 10:11:00
使用函数更改指针包含的地址如果我声明了一个指针p如int *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;}地址内容不变。在相同的任务中使用函数有什么问题?
查看完整描述

3 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

在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+,另一种方法是更改函数以接受对指针的引用。


查看完整回答
反对 回复 2019-07-03
?
繁星coding

TA贡献1797条经验 获得超4个赞

在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


查看完整回答
反对 回复 2019-07-03
?
九州编程

TA贡献1785条经验 获得超4个赞

如果您想在C中修改函数中变量的内容,指针也是一个变量,您必须传递它。指针间接参考总是用&地址和*去引用操作符。我是说*在更改变量的值时,始终使用运算符并将其放在前面。

#include <stdio.h>#include <stdlib.h>void changeIntVal(int *x) {
    *x = 5;}void changePointerAddr(int **q) {
    int *newad;
    *q = newad;}void changePPAddr(int ***q) {
    int **dummy;
    *q = dummy;}int main() {
    int *p;
    int **pp;
    int *tempForPP;
    int a = 0;
    printf("\n The address pointing by p -> %p, pp -> %p, value of a -> %d ", p, pp, a);


    p = &a;
    pp = &tempForPP;
    printf("\n The address pointing by p -> %p, pp -> %p, value of a -> %d ", p, pp, a);

    changeIntVal(&a);        // ----
                             //    |---
    changePointerAddr(&p);   // ----  |---->  parts of what I mean
                             //    |---
    changePPAddr(&pp);       // ----

    printf("\n The address pointing by p -> %p, pp -> %p, value of a -> %d ", p, pp, a);

    return 0;}


查看完整回答
反对 回复 2019-07-03
  • 3 回答
  • 0 关注
  • 590 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信