我有以下代码:
void change_adrs(int **q)
{
int * otheraddess;
*q = otheraddress;
}
我无法理解此作业:*q = otheraddress;
有人可以帮我解释一下吗?为什么我们不能使用其他分配,例如:
**q = otheraddress;
*q = *otheraddress;
q = &otheraddress;
答案 0 :(得分:1)
声明变量后,*
取消引用它们。
例如,在声明类似int **a;
之类的东西之后,使用它时,我们得到:
**a
的值在a
中存储的位置中的值(最终是一个整数)
*a
在a
(另一个位置)中存储的位置中的值
a
的位置存储在a
&a
本身的 a
位置
让我们看一下,看看为什么每个示例都不起作用:
**q = otheraddress;
将位置分配给int×
*q = *otheraddress;
将整数分配给位置×
编辑:让我们看一下以下两个示例:
q = &otheraddress;
将位置分配给位置✓
*q = otheraddress;
将位置分配给位置✓
让我们这样看:
int *a;
int **q;
为了防止将来出现分段错误,让我们首先为a分配一些地址:
int t = 5
a = &t;
让我们看看q = &a
之后的地址:
//first snippet
0x7fffc3a2b338 // &a
0x5596853c98c0 // a
5 // *a
0x7fffc3a2b340 // &q
0x7fffc3a2b338 // q
0x5596853c98c0 // *q
5 // **q
如预期的那样,将&a
放入q
中,并且a
持有&t
,因此**(&a)
和**(q)
都将保留一个值之5。
现在让我们看一下*q = a
之后的地址:
//second snippet
0x7fffc3a2b338 // &a
0x5596853c98c0 // a
5 // *a
0x7fffc3a2b340 // &q
0x7fffc3a2b345 // q
0x5596853c98c0 // *q
5 // **q
在这里,a
被放到*q
中,而a
本身就是&t
,因此*(a)
和*(*q)
都具有一个值之5。
要了解差异,我们来看一个示例:
int b = 3;
a = &b;
在第一个代码段之后使用此地址,a
被赋予了另一个地址,并且q
被声明为&a
(未更改),因此**(q)
具有相同的地址值为**(&a)
,现在为3。
这就像在说:
int a = 3;
int *b = &a;
a = 5; //even though a has changed, b retains its old value of &a, thus *(b) == *(&a) == 5
但是在第二个片段中,*q
在更改之前已经声明为a
,因此即使a
现在有了一个新地址,*q
中的地址仍然没有改变。因此,尝试访问*(*q)
将使用旧地址并再次给我们5。
这就像在说:
int a = 3;
int b = a;
a = 5; //even though a has changed, b still retains it's old value of 3
答案 1 :(得分:1)
void change_ptr(int **q)
{
*q = malloc(somemem);
}
void foo()
{
int *ptr;
change_ptr(&ptr);
}
在此示例中,它将更改ptr
本身的值。当您传递单个星形指针时,您只能更改引用的对象。
答案 2 :(得分:1)
查看*q = otheraddress;
的分配与查看以下内容相同:
int x = 4;
int y = x;
您选择2个相同类型的变量,并在它们之间进行分配。
在您的情况下,请使用int vairables的地址。
int *otheraddress;
是可转换的,可以将地址(&运算符)获取为可转换的整数,例如:
int x = 4;
int *p = &x; //p<=the address of x
和int **q;
可以获得可变的地址,该地址可以得到int地址。例如您的第3个作业(应该可以正常工作):
int x = 4;
int *p = &x;//p<=the address of x
int **q = &p;//q<=the address of p
对于其他分配对象:
**q = otheraddress;
,您尝试将int *分配给int **
*q = *otheraddress;
,您尝试将int分配给int *