Подтвердить что ты не робот

Error: неверный аргумент типа 'унарный * (есть' int)

У меня есть программа C:

#include <stdio.h>
int main(){
  int b = 10;             //assign the integer 10 to variable 'b'

  int *a;                 //declare a pointer to an integer 'a'

  a=(int *)&b;            //Get the memory location of variable 'b' cast it
                          //to an int pointer and assign it to pointer 'a'

  int *c;                 //declare a pointer to an integer 'c'

  c=(int *)&a;            //Get the memory location of variable 'a' which is
                          //a pointer to 'b'.  Cast that to an int pointer 
                          //and assign it to pointer 'c'.

  printf("%d",(**c));     //ERROR HAPPENS HERE.  

  return 0;
}    

Компилятор выдает ошибку:

error: invalid type argument of ‘unary *’ (have ‘int’)

Может кто-нибудь объяснить, что означает эта ошибка?

4b9b3361

Ответ 1

Так как c удерживает адрес целочисленного указателя, его тип должен быть int**:

int **c;
c = &a;

Вся программа становится:

#include <stdio.h>                                                              
int main(){
    int b=10;
    int *a;
    a=&b;
    int **c;
    c=&a;
    printf("%d",(**c));   //successfully prints 10
    return 0;
}

Ответ 2

Программа Barebones C выдаёт вышеуказанную ошибку:

#include <iostream>
using namespace std;
int main(){
    char *p;
    *p = 'c';

    cout << *p[0];  
    //error: invalid type argument of 'unary *'
    //peeking too deeply into p, that a paddlin.

    cout << **p;    
    //error: invalid type argument of 'unary *'
    //peeking too deeply into p, you better believe that a paddlin.
}

ELI5:

Мастер кладет в маленькую коробку блестящий круглый камень и отдает его ученику. Мастер говорит: "Откройте коробку и уберите камень". Студент так и делает.

Тогда мастер говорит: "Теперь открой камень и убери камень". Студент сказал: "Я не могу открыть камень".

Студент был тогда просветленным.

Ответ 3

Я переформатировал ваш код.

Ошибка находилась в этой строке:

printf("%d", (**c));

Чтобы исправить это, измените на:

printf("%d", (*c));

* извлекает значение из адреса. ** извлекает значение (адрес в этом случае) другого значения из адреса.

Кроме того, опция() была необязательной.

#include <stdio.h>

int main(void)
{
    int b = 10; 
    int *a = NULL;
    int *c = NULL;

    a = &b;
    c = &a;

    printf("%d", *c);

    return 0;
} 

EDIT:

Строка:

c = &a;

необходимо заменить на:

c = a;

Это означает, что значение указателя 'c' равно значению указателя 'a'. Итак, "c" и "a" указывают на один и тот же адрес ( "b" ). Выход:

10

ИЗМЕНИТЬ 2:

Если вы хотите использовать double *:

#include <stdio.h>

int main(void)
{
    int b = 10; 
    int *a = NULL;
    int **c = NULL;

    a = &b;
    c = &a;

    printf("%d", **c);

    return 0;
} 

Вывод:

10

Ответ 4

Как только вы объявите тип переменной, вам не нужно указывать ее на тот же тип. Поэтому вы можете написать a=&b;. Наконец, вы указали c неправильно. Поскольку вы назначаете его адресом a, где a является указателем на int, вы должны объявить его указателем на указатель на int.

#include <stdio.h>
int main(void)
{
    int b=10;
    int *a=&b;
    int **c=&a;
    printf("%d", **c);
    return 0;
}