指向作为函数中参数的指针的指针

时间:2019-05-12 04:14:20

标签: c pointers

我有以下代码:

void change_adrs(int **q)
{
    int * otheraddess;
    *q = otheraddress; 
}

我无法理解此作业:*q = otheraddress;

有人可以帮我解释一下吗?为什么我们不能使用其他分配,例如:

**q = otheraddress; 
*q = *otheraddress;
q = &otheraddress; 

3 个答案:

答案 0 :(得分:1)

声明变量后,*取消引用它们。

例如,在声明类似int **a;之类的东西之后,使用它时,我们得到:

**a的值在a中存储的位置中的值(最终是一个整数)

*aa(另一个位置)中存储的位置中的值

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 *