2011-04-28 37 views
5
struct counter{ 
    long long counter; 
} 

struct instruction{ 
    struct counter *counter 
    int repetitions; 
    void (*work_fn)(long long *); 
}; 

int ncounter; //number of counters 
struct counter *counter; //counter array 

int nthreads; //number of threads 
int *ninstructions; //number of instructions 

struct instruction **instructions; 

¿Cómo funciona esto en realidad? Tengo problemas con ** punterosC doble puntero

+2

Podría ser una buena idea para no poner la pregunta en un comentario la línea de código. – takrl

+3

Por favor, no etiquetes las preguntas C con C# si no sabes qué es C#. – BoltClock

+0

Por favor, haga su pregunta fuera del bloque de código de lo contrario las personas no lo verán. Lo he editado y lo moví ahora. –

Respuesta

10

Un ** es sólo un puntero a un puntero. Así que cuando un instruction* contiene la dirección de una estructura instruction, un instruction** contiene la dirección de un instruction* que contiene la dirección de un objeto instruction.

Para acceder al instruction apuntado por el puntero apuntado por un instruction**, solo usa dos asteriscos en lugar de uno, como (**p).repetitions o algo similar.

Puede visualizarlo así:

instruction* ----> instruction 
instruction** ----> instruction* ----> instruction 

Recuerde, sin embargo, que simplemente se declara struct instruction** instructions; no crea realmente una estructura instruction. Simplemente crea un puntero que contiene un valor de basura. Vas a tener que inicializarlo:

struct instruction inst; 
// set members of inst... 
*instructions = &inst; 

... 

(*instructions)->repetitions++; // or whatever 

Sin embargo, parece que estás usando una instruction** para que apunte a una serie de instruction* s. Para inicializar la matriz, se necesita un bucle de for:

instructions = malloc(sizeof(struct instruction*) * num_of_arrays); 
for (i = 0; i < num_of_arrays; ++i) 
    instructions[i] = malloc(sizeof(struct instruction) * size_of_each_subarray); 

Y a continuación, se puede acceder a un elemento como instructions[i]->datamember.

+0

...... pero dicen que utilizo * contador contadores estructura e hice una matriz. Cuando accedo a los elementos, contador [i] -> contadores ... ¿no es lo mismo?!? pero los contadores son * no ** – Jono

+0

@Jono, si dices 'contadores struct * contadores', eso hace un puntero a un 'contador'. Para acceder a un elemento, haces 'contadores [i] .something'. 'counters [i]' te da un 'contador'. Sin embargo, si haces 'struct counter ** counters', tienes que hacer' counters [i] -> something', fíjate en '->' en lugar de '.'.En este caso, 'counters [i]' le da un _pointer_ a un 'contador', no un' contador' real. –

1

struct instruction **instructions; // How does this actually works ? I am having trouble with ** pointers

no estoy seguro de cuál es el problema real es, pero voy a tratar de responder a la pregunta.

puntero doble es un puntero a puntero. Se puede demandar como una matriz de punteros, por ejemplo (si asigna memoria en consecuencia). Por ejemplo:

instructions = malloc(5*sizeof(struct instruction*)); 
for (int i = 0; i < 5; i++) 
    instructions[i] = malloc(sizeof(struct instruction)); 

y se encontrara en buen conjunto de 5 punteros a struct instruction. Utilizar de esta manera:

instructions[0]->repetitions = 0; 
0

instructions es un puntero a un puntero a struct instruction.

Esto significa que *instructions le dará un puntero a struct instruction. Este tipo de constructo se usa a menudo para crear una matriz dinámica de punteros a algún tipo compuesto.