如何解决我可以用C语言更改指针变量的地址吗?
例如,如果有一个指针变量int *a
,int *b
,并且每个地址值分别是1000
,2000
,则可以交换指针变量的地址值吗?好像在交换公共变量的值?
注意,我的意思是指针的地址。不是它包含的值。
据我所知,指针变量的地址值是固定的,不能更改,对吗?
解决方法
来自评论:
很多人回答,但是我想我问错了问题。抱歉,我的问题不是关于“更改指针变量的内容”,而是“更改指针变量的地址”。
否,这对于任何变量都是不可能的。不只是指针。
,我可以用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 ++部分的问题
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。