C 错误:“一元*”的类型参数无效(具有“int”)

C 错误:“一元*”的类型参数无效(具有“int”),c,pointers,C,Pointers,我有一个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'

我有一个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;
}    

有人能解释一下这个错误是什么意思吗

我已重新格式化了您的代码

错误位于这一行:

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”指向同一个地址“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;
} 
由于c持有整数指针的地址,其类型应为int**:

整个程序变成:

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

一旦声明了变量的类型,就不需要将其强制转换为同一类型。因此您可以编写a=&b;。最后,您错误地声明了c。由于将其指定为a的地址,其中a是指向int的指针,因此必须将其声明为指向int的指针

Barebones C程序产生上述错误:

ELI5:

老师把一块闪亮的圆形石头放在一个小盒子里,交给一个学生。大师说:打开盒子,取出石头。学生这样做了

然后大师说:现在打开石头,把石头移走。学生说:我打不开石头


学生随后被启发。

我不确定是否解决了问题,打印的结果是-108149370,而不是10。是的,Sandro确实打印了10,但目标是使用双解引用打印b I.e.10的值。我认为**c是故意的。@picstand请参阅我的编辑2;这对你合适吗?还要注意答案中缺少类型转换。问题中的强制转换隐藏了将int**分配给int*的行上的问题。c=int*&a;
#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
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;
}
#include <stdio.h>
int main(void)
{
    int b=10;
    int *a=&b;
    int **c=&a;
    printf("%d", **c);
    return 0;
} 
#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.
}