Не могу передать адрес указателю

Я сделал простую тестовую программу для доступа и увеличения 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. Измените это на int тип.

&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 **. Я думаю, это не то, что вы хотели сделать, и результаты могут быть удивительными)

Другие вопросы по тегам