2011-03-28 22 views
22

tengo un programa en C:error: argumento de tipo no válido de '* unario' (tiene 'int')

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

compilador produce un error:

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

Puede alguien explicar lo que este error ¿medio?

Respuesta

17

Desde c es la celebración de la dirección de un puntero entero, su tipo debe ser int**:

int **c; 
c = &a; 

Todo el programa se convierte en:

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

También tenga en cuenta la falta de moldes en la respuesta. Los moldes en la pregunta ocultan los problemas en la línea que está asignando un 'int **' a un 'int *'. ('c = (int *) & a;') – Thanatos

5

He reformateado su código.

El error se encuentra en esta línea:

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

solucionarlo, cambie a:

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

El * recupera el valor de una dirección. El ** recupera el valor (una dirección en este caso) de otro valor de una dirección.

Además, el() era opcional.

#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:

La línea:

c = &a; 

debe ser sustituido por:

c = a; 

significa que el valor del puntero 'c' es igual a la valor del puntero 'a'. Entonces, 'c' y 'a' apuntan a la misma dirección ('b'). La salida es:

10 

EDIT 2:

Si desea utilizar un doble *:

#include <stdio.h> 

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

    a = &b; 
    c = &a; 

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

    return 0; 
} 

Salida:

10 
+0

No estoy seguro de que resuelve el problema, el resultado impreso es "- 108149370 "y no 10. – picstand

+0

Sí, lea el EDIT ;-) Resuelve el problema. –

+0

sí Sandro que imprime 10, pero el objetivo es utilizar la doble desreferencia para imprimir el valor de b (es decir, 10). – picstand

0

Una vez que se declara el tipo de una variable, no es necesario para su emisión a ese mismo tipo. Entonces puedes escribir a=&b;. Finalmente, declaró c incorrectamente. Como la asigna a la dirección a, donde a es un puntero a int, debe declarar que es un puntero a un puntero a int.

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

yup que lo hace. gracias hombre – picstand

10

programa para producir el error anterior 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:

You have a big plasma TV cardboard box that contains a small Jewelry box that 
contains a diamond. You asked me to get the cardboard box, open the box and 
get the jewelry box, open the jewelry box, then open the diamond to find what 
is inside the diamond. 
"I don't understand", Says the student, "I can't open the diamond". 

Then the student was enlightened. 
Cuestiones relacionadas