![](/img/trans.png)
[英]In C, I understand why not to return the address of a local variable in a pointer returning function, how can I fix it though?
[英]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.