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

标签 c function pointers

如果我将指针 p 声明为 int *p;在主模块中,我可以通过分配 p = &a; 来更改 p 包含的地址,其中 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 中,函数参数按值传递。因此,由您的参数创建了一个副本,并且对该副本进行了更改,而不是您希望看到修改的实际指针对象。如果要执行此操作,您将需要更改您的函数以接受指向指针的参数并更改取消引用的参数。 例如

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

关于使用函数更改指针包含的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13431108/

相关文章:

javascript - 从 Javascript 函数返回 JSON 对象

c - C 函数通常比 OOP 语言的方法有更多的参数吗?

C++ 将对象传递给函数

c++ - 如何使用指针数组实现插入排序?

C Language : trouble using enumerated variable and type definited in main. c文件在另一个文件里面

c++ - 寻找一个用于嵌入式系统的线性代数库(没有 malloc 和 free)

c++ - 如何使用C/C++读取目录的文件索引?

c - 从 C 中的文本文件中读取\n 作为真正的 Feed Line 字符

c - (int*) &var 是什么意思?

c++ - 在C/C++中使用双指针有什么好处