[英]Pointer to pointer as argument in a function
我有以下代碼:
void change_adrs(int **q)
{
int * otheraddess;
*q = otheraddress;
}
我無法理解此分配: *q = otheraddress;
誰能幫我解釋一下。 為什么我們不能使用其他任務,例如:
**q = otheraddress;
*q = *otheraddress;
q = &otheraddress;
聲明變量后, *
取消引用它們。
例如,在聲明類似int **a;
,使用時我們有:
**a
在存儲在位置值值a
(其為最終的int)
*a
存儲在位置值a
(這是另一種位置)
a
存儲在位置a
&a
的位置, a
本身
讓我們看看為什么每個示例都不起作用:
**q = otheraddress;
將位置分配給int×
*q = *otheraddress;
將int分配給位置×
編輯:讓我們看一下這兩個示例:
q = &otheraddress;
將位置分配給位置✓
*q = otheraddress;
將位置分配給位置✓
讓我們這樣看:
int *a;
int **q;
為了防止將來出現分段錯誤,讓我們首先為以下地址分配一些地址:
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
void change_ptr(int **q)
{
*q = malloc(somemem);
}
void foo()
{
int *ptr;
change_ptr(&ptr);
}
在此示例中,它將更改ptr
本身的值。 當傳遞單個星形指針時,只能更改引用的對象。
查看*q = otheraddress;
的分配*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;
可以得到一個可變的地址,可以得到一個整數地址。 例如您的第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 *
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.