ошибка: недопустимый аргумент типа «унарный *» (имеет «int») - PullRequest
25 голосов
/ 28 марта 2011

У меня есть программа на 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’)

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

Ответы [ 4 ]

21 голосов
/ 28 марта 2011

Поскольку 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;
}
14 голосов
/ 30 сентября 2013

Программа 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's a paddlin.

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

ELI5:

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

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

Тогда ученик был просветленным.

5 голосов
/ 28 марта 2011

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

Ошибка была в этой строке:

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;
} 

РЕДАКТИРОВАТЬ:

Строка:

c = &a;

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

c = a;

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

10

РЕДАКТИРОВАТЬ 2:

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

#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
0 голосов
/ 28 марта 2011

Как только вы объявляете тип переменной, вам не нужно приводить ее к тому же типу.Таким образом, вы можете написать 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;
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...