簡體   English   中英

指向函數中作為參數的指針

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM