Не могу передать адрес указателю
Я сделал простую тестовую программу для доступа и увеличения 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;
}
3 ответа
&latestint
является int **
в то время как insert()
ожидает int *
,
Что касается того, почему он работает правильно, компилятор int **
в int *
неявно, поэтому адрес latestint
передается в insert()
, его значение равно 0, поэтому вы получите результат по совпадению. Таблица проиллюстрирует это наглядно.
+------------+------------+--------+-----------+
| Address | Value | Type | label |
+------------+------------+--------+-----------+
| 0x12345678 | 0x00000000 | int * | latestint |
| whatever | 0x12345678 | int ** | &latestint|
+------------+------------+--------+-----------+
В языке Си указатель является переменной. И, как и любая переменная, каждый указатель имеет тип. В вашем коде переменная "lastint" является указателем типа "int":
int * latestint = 0;
Значения также имеют свои типы (5 - это int, "a" - это символ и т. Д.). Выражение "&latestint" является адресом переменной "latestint". Этот адрес является значением (число). Поскольку "lastint" является указателем (переменная, которая содержит адрес другой переменной), "&latestint" является адресом указателя (указатель типа int), поэтому тип "&latestint" является int **.
Затем, когда вы передаете & latestint в функцию "insert()", компилятор сообщает вам, что "&latestint" имеет тип int **, но функция "insert ()" ожидает int *.
Вам просто нужно удалить "*" в объявлении "latestint", и тогда тип "&latestint" будет "int *".
(Вы также можете изменить "вставить" так, чтобы он ожидал int **. Я думаю, это не то, что вы хотели сделать, и результаты могут быть удивительными)