【问题标题】:Can I change the address of the pointer variable in C language?C语言可以改变指针变量的地址吗?
【发布时间】:2020-10-23 12:58:20
【问题描述】:

例如,如果有一个指针变量int *a,int *b,并且每个地址值是1000,2000,那么指针变量的地址值是否可以像交换公共变量?

注意,我指的是指针的地址。不是它包含的值。

据我所知,指针变量的地址值是固定的,不能改变的,是吗?

【问题讨论】:

  • 这很容易尝试。
  • 我是说,在写这个问题的时候,你可以写{int *a, *b, *tmp; tmp = a; a=b; b=tmp;} 并尝试一下。
  • 顺便说一句,“变量”这个词的意思是“可变的”。
  • 很多人回答,但我想我问错了问题。对不起,我的问题不是“改变指针变量的内容”,而是“改变指针变量的地址”。
  • 我回答了这两个问题。请参阅您上面的评论。答案是“不”,您不能更改变量的地址。您只能更改其内容。

标签: c pointers swap


【解决方案1】:

来自 cmets:

很多人都回答了,但我想我问错了问题。对不起,我的问题不是“改变指针变量的内容”,而是“改变指针变量的地址”。

不,这对于任何变量都是不可能的。不仅仅是指针。

【讨论】:

  • 哦,谢谢大家,感谢大家阅读我的闷帖子。
【解决方案2】:

c语言中可以改变指针变量的地址吗?

虽然对于many other languages(包括 C++),您的问题的答案是是,有点:

"虽然 C++ 不直接支持将变量放在给定地址,但可以通过创建对 那个地址:"...

...C 的答案是否定的。"A pointer has an address like other variables (which can't and needn't be changed)"。 (引用链接中的第 4 个响应。)

对于C,所有变量的地址(声明为register 的变量除外)在声明时分配为操作系统提供的内存位置,并且对于它们的其余部分是不可变的生命,无论它们是在什么范围内创建的。
所以,虽然指针变量指向的地址可以改变,但变量本身的地址却不能。

【讨论】:

  • 感谢您的回答。但我想知道是否可以更改打印 &a 和 &b 作为 printf 函数时打印的地址的值。
  • ryyker 谢谢你的努力,但我想要的不是改变pA,pB,而是改变&pA,&pB。
  • 没问题,这是一个令人困惑的问题?
  • @honghoker - 我误解了你的问题,但已编辑更正。
【解决方案3】:

是的,您可以:

void swapPointers(void **a, void **b) {
    void *t = *a;
    *a = *b;
    *b = t;
}

void someOtherFunc() {
    int *x = malloc(sizeof(int));
    int *y = malloc(sizeof(int));
    *x = 3;
    *y = 5;
    printf("x = %d y = %d\n", *x, *y);

    swapPointers(&x, &y);
    printf("x = %d y = %d\n", *x, *y);
}

【讨论】:

  • 事实上,你不能改变指针的地址,但如果正确的短语是“我可以交换它们指向的指针的值吗”,那么答案是“是”。
【解决方案4】:

是的,您可以交换指针指向的地址。

int main()
{
     int x = 5, y = 10;
     int* p1 = &x;
     int* p2 = &y;
     printf("Address pointed by p1 is: %p\n", p1);
     printf("Address pointed by p2 is: %p\n", p2);
     //Here goes the swapping
     int* p3 = p1;
     p1 = p2;
     p2 = p3; 
     printf("\n--After swap--\n");
     printf("Address pointed by p1 is: %p\n", p1);
     printf("Address pointed by p2 is: %p\n", p2);
}

【讨论】:

    【解决方案5】:

    我认为您的意思是交换存储在指针中的地址,因为您不能将指针的地址交换为声明的变量本身。

    要在函数中交换两个对象,您必须通过引用传递它们。否则,该函数将处理直接传递给它的对象的值的副本。

    在 C 中,通过引用传递意味着通过指向它的指针间接传递一个对象。

    指针是相同的对象。

    所以你可以这样写交换函数

    void swap_ptr( int **a, int **b )
    {
        int *tmp = *a;
        *a = *b;
        *b = tmp;
    }
    

    并且函数可以像这样调用

    int *a = /*...*/;
    int *b = /*...*/;
    
    //...
    
    swap_ptr( &a, &b );
    

    【讨论】:

      【解决方案6】:

      是的,您只需交换每个指针指向的位置即可。 声明第三个指针,然后按如下方式进行交换。

      //we have *a and *b
      
      int *tmp;
      tmp = a;
      a = b;
      b = tmp;
      

      【讨论】:

        【解决方案7】:

        是的,您可以使用临时指针变量交换存储在两个指针中的地址。但是如果指针被声明为示例的常量指针 const int *ptr1; 那么这是不可能的,因为存储在 ptr1 中的地址不能被修改

        #include <iostream>
        using namespace std;
        
        int main() {
           int a=10;
           int b=20;
           int *ptr1;
           int *ptr2;
           ptr1=&a;
           ptr2=&b;
           cout<<ptr1<<" "<<ptr2<<"\n";
           int *temp;
           temp=ptr1;
           ptr1=ptr2;
           ptr2=temp;
           cout<<ptr1<<" "<<ptr2;
        
           return 0;
        
           }
        

        您可以将语法更改为 c,因为我认为我正在回答 c++ 部分的问题

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-05-26
          • 2018-01-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多