簡體   English   中英

無法將地址傳遞給指針

[英]Can't pass address to pointer

我已經編寫了一個簡單的測試程序來訪問和遞增存儲在正確運行的內存地址中的int,並在運行時輸出1 ,但是當我這樣做時,我得到一條warning ,內容如下: warning: passing argument 1 of 'insert' from incompatible pointer type但是,我在傳遞要insert的地址以聲明要接受指針時,無法看到問題所在。

#include <stdio.h>

static void insert(int *nextfreeplace) {
        (*nextfreeplace)++;
        printf("%i\n", *nextfreeplace);

}
int main() {
        int * latestint = 0;
        insert(&latestint);
        return 0;
}

&latestintint **insert()期望是int *
至於為什么它可以正確運行,編譯器將int **隱式轉換為int *因此latestint的地址傳遞給insert() ,其值為0,因此您會巧合地得到輸出。 表格可以清楚地說明這一點。

+------------+------------+--------+-----------+
|  Address   |   Value    |  Type  |   label   |
+------------+------------+--------+-----------+
| 0x12345678 | 0x00000000 | int *  | latestint |
| whatever   | 0x12345678 | int ** | &latestint|
+------------+------------+--------+-----------+

latestint是指向int的指針。 將其更改為int類型。

在C語言中,指針是變量。 像任何變量一樣,每個指針都有一個類型。 在您的代碼中,變量“ latestint”是類型“ int”的指針:

int * latestint = 0;

值也有其類型(5是int,'a'是char等)。 表達式“&latestint”是變量“ latestint”的地址。 該地址是一個值(數字)。 由於“ latestint”是指針(包含另一個變量的地址的變量),因此“&latestint”是指針(int指針)的地址,因此“&latestint”的類型為int **。

然后,當您將&latestint傳遞給函數“ insert()”時,編譯器會告訴您“&latestint”的類型為int **,但是函數“ insert()”將等待int *。

您只需刪除“ latestint”的聲明中的“ *”,然后“&latestint”的類型將為“ int *”。

(您也可以修改“插入”,以便它等待一個int **。我想這不是您想要執行的操作,結果可能令人驚訝)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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