我可以用C语言更改指针变量的地址吗?

问题描述

例如,如果有一个指针变量int *aint *b,并且每个地址值分别是10002000,则可以交换指针变量的地址值吗?好像在交换公共变量的值?

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

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

解决方法

来自评论:

很多人回答,但是我想我问错了问题。抱歉,我的问题不是关于“更改指针变量的内容”,而是“更改指针变量的地址”。

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

,

我可以用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的变量除外)在声明时被分配为操作系统提供的内存位置,并且对于剩下的生命,无论创作范围如何。
因此,尽管可以更改指针变量指向的地址 ,但是变量本身的地址却不能。

,

是的,您可以:

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",*y);
}
,

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

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

在C中,按引用传递是指通过对象的指针间接传递对象。

指针是相同的对象。

因此您可以通过以下方式编写交换功能

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

该函数可以像

那样调用
int *a = /*...*/;
int *b = /*...*/;

//...

swap_ptr( &a,&b );
,

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

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",p2);
}
,

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

//we have *a and *b

int *tmp;
tmp = a;
a = b;
b = tmp;
,

是的,您可以使用临时指针变量交换存储在两个指针中的地址。但是,如果将指针声明为示例 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 ++部分的问题