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

Changing address contained by pointer using function

提问人:pranphy 提问时间:11/17/2012 最后编辑:Neuronpranphy 更新时间:12/13/2021 访问量:92788

问:

如果我已将指针声明为 ;在主模块中,我可以通过分配 where 是另一个已声明的整数变量来更改包含的地址。 我现在想使用以下函数更改地址:pint *ppp = &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("The address is %u\n", p);
    change_adrs(p);
    printf("The address is %u\n", p); // but this doesn't change the address
    return 0;
}

地址内容不变。将函数用于同一任务有什么问题?

C 函数 指针

评论

8赞 Alok Save 11/17/2012
您正在按值传递指针。如果需要更改函数内部的指针,请通过引用传递它...双指针。

答:

75赞 mathematician1975 11/17/2012 #1

在 C 语言中,函数参数按值传递。因此,将创建参数的副本,并对该副本进行更改,而不是对您期望看到修改的实际指针对象进行更改。如果要执行此操作,则需要更改函数以接受指针到指针参数,并对取消引用的参数进行更改。 例如

 void foo(int** p) {
      *p = NULL;  /* set pointer to null */
 }
 void foo2(int* p) {
      p = NULL;  /* makes copy of p and copy is set to null*/
 }

 int main() {
     int* k;
     foo2(k);   /* k unchanged */
     foo(&k);   /* NOW k == NULL */
 }

如果您有幸使用 C++,另一种方法是更改函数以接受对指针的引用。

评论

4赞 JKRT 11/18/2017
我只想指出,C 标准并不能保证将 p 赋值为 0 会使其为 null。
0赞 mLstudent33 7/6/2020
如果我在被调用的函数中有一个新数组并指向它,是吗?*arr = malloc()**p*p = &arr
2赞 Chris Dodd 11/17/2020
@JKRT:C 规范中的 6.2.3.2 说“值为 0 的整数常量表达式,或转换为 void * 类型的表达式,称为空指针常量”——因此分配文本 0 将使其为 null。该句子中的“或”表示不需要强制转换。
0赞 Stryker2k2 10/18/2023
我的英雄!<3 你摇滚!
1赞 Omkant 11/17/2012 #2

这不会改变的实际值,因为 in 函数是该函数的本地值,并且该函数中的更改不会反映在,因此传递 的地址而不是按值传递pqmainpp

在下面使用以下语法

void change_adrs(int **q)
{
    int * otheraddess;
    *q = otheraddress; 
}

并像这样打电话change_adrs(&p);

或者,您有其他解决方法: 更改函数的返回类型并捕获返回的地址。

int* change_adrs(int *q)
{
    int * otheraddess;
    q = otheraddress;
    return q; 
}


int main()
{
    p = change_adrs(p);
    return 0;
}
20赞 user529758 11/17/2012 #3

在 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

评论

2赞 William Pursell 8/6/2020
点赞纯粹是因为这个答案避免了“双指针”一词
0赞 Stryker2k2 10/18/2023
正是我想要的。太棒了!
1赞 todkwxrtvwmzonunswam 4/11/2014 #4

对于基元数据类型(如 ),双指针不是必需的。您可以直接写入存储的地址,将其地址视为被调用函数中的指针。这与数组(“字符串”)不同,在数组(“字符串”)中,指向的内容的大小是可变的,因此在从调用的函数中更改它时,必须使用另一个间接级别。试试这个:intintchar

void foo(int *oldVal)
{
    int newVal = 99;    // or whatever you want
    *oldVal = newVal;
}

int main(int argc, char *argv[])
{
    int someVal = 0;
    foo(&someVal);      // we send its address to foo()

    printf("someVal is now %d.\n", someVal);

    return EXIT_SUCCESS;
}

评论

0赞 Phiber 5/30/2016
这不是对问题的回答!,他要求更改指针地址而不是指针值
4赞 Soner from The Ottoman Empire 6/4/2017 #5

如果你想在 C 语言中改变函数中变量的内容,指针也是一种变量,你必须通过使用 always address 和 dereference 运算符通过指针间接引用来传递它。我的意思是,在更改变量的值时,总是使用运算符并放在前面。&**

#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;

}