2011-04-28 71 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ách này thực sự hoạt động? Tôi gặp sự cố với ** con trỏCon trỏ kép

+2

Có thể không nên đặt câu hỏi trong nhận xét dòng mã. – takrl

+3

Vui lòng không gắn thẻ C câu hỏi với C# nếu bạn không biết C# là gì. – BoltClock

+0

Vui lòng đặt câu hỏi của bạn bên ngoài khối mã nếu không mọi người sẽ không nhìn thấy nó. Tôi đã chỉnh sửa nó và di chuyển nó ra ngay bây giờ. –

Trả lời

10

A ** chỉ là con trỏ đến con trỏ. Vì vậy, nơi một số instruction* chứa địa chỉ của cấu trúc instruction, một số instruction** chứa địa chỉ của instruction* có chứa địa chỉ của đối tượng instruction.

Để truy cập instruction được trỏ tới bởi một con trỏ được trỏ đến bởi một instruction**, bạn chỉ cần sử dụng hai dấu sao thay vì một dấu sao, như (**p).repetitions hoặc một cái gì đó tương tự.

Bạn có thể hình dung nó như thế này:

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

Nên nhớ, tuy nhiên, mà chỉ đơn giản tuyên bố struct instruction** instructions; không thực sự tạo ra một struct instruction. Nó chỉ tạo ra một con trỏ chứa một giá trị rác. Bạn sẽ phải khởi tạo nó:

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

... 

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

Tuy nhiên, có vẻ như bạn đang sử dụng một instruction** để trỏ đến một mảng của instruction* s. Để khởi tạo mảng, bạn cần một vòng lặp 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); 

Và sau đó bạn có thể truy cập vào một yếu tố như instructions[i]->datamember.

+0

nhưng nói tôi sử dụng bộ đếm truy cập cấu trúc * và tạo một mảng. Khi tôi truy cập vào các yếu tố, truy cập [i] -> quầy ..... không phải là điều tương tự?!? nhưng quầy là * không ** – Jono

+0

@Jono, Nếu bạn nói 'struct counter * counters', điều đó làm cho một con trỏ tới một' counter'. Để truy cập một phần tử, bạn thực hiện 'counters [i] .something'. 'counters [i]' cung cấp cho bạn một 'counter'. Tuy nhiên, nếu bạn thực hiện 'counter counter ** counters', bạn phải thực hiện' counters [i] -> something', chú ý '->' thay vì '.'.Trong trường hợp này, 'counters [i]' cho bạn một _pointer_ tới một 'counter', không phải là' counter' thực tế. –

1

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

Tôi không chắc chắn những gì các vấn đề thực sự là, nhưng tôi sẽ cố gắng trả lời câu hỏi.

Con trỏ kép là con trỏ trỏ tới con trỏ. Nó có thể bị kiện như mảng con trỏ ví dụ (nếu bạn phân bổ bộ nhớ cho phù hợp). Ví dụ:

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

Và bạn có một loạt 5 con trỏ đến struct instruction. Sử dụng nó như sau:

instructions[0]->repetitions = 0; 
0

instructions là con trỏ đến con trỏ tới struct instruction.

Điều này có nghĩa là *instructions sẽ cung cấp cho bạn một con trỏ đến struct instruction. Kiểu cấu trúc này thường được sử dụng để tạo ra một mảng động của các con trỏ tới một số loại hợp chất.

Các vấn đề liên quan