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’)
Может кто-нибудь объяснить, что означает эта ошибка?
Ответы
Ответ 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;
}