繁体   English   中英

C语言可以修改指针变量的地址吗?

[英]Can I change the address of the pointer variable in C language?

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

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

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

来自评论:

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

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

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

虽然对于包括 C++ 在内的许多其他语言,您的问题的答案是肯定的但是

“虽然 C++ 不直接支持将变量放在给定地址,但可以通过创建对该地址的引用来实现相同的效果:” ...

... C的答案是否定的。 “指针具有与其他变量一样的地址(不能也不需要更改)” (引自链接中的第 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", *x, *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", p1);
     printf("Address pointed by p2 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++ 部分的问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM