Tôi nghĩ rằng nó là giá trị thêm vào các câu trả lời khác giải thích nhanh về con trỏ, mảng và vị trí bộ nhớ trong c.
Thứ nhất mảng trong c chỉ là một khối bộ nhớ đủ lớn để chứa số lượng các mục trong mảng (xem http://www.cplusplus.com/doc/tutorial/arrays/)
vì vậy nếu chúng tôi đã nói
int[5] example;
example[0] = 1;
example[1] = 2;
example[2] = 3;
example[3] = 4;
example[4] = 5;
Giả sử int là 32 bit chúng tôi sẽ có một khối bộ nhớ 5 * 32bits = 160bits dài. Vì C là một ngôn ngữ cấp thấp nó cố gắng hiệu quả nhất có thể, nên lưu trữ ít nhất thông tin về mảng càng tốt, trong trường hợp này số tiền ít nhất có thể là địa chỉ bộ nhớ của phần tử đầu tiên. Vì vậy, loại ví dụ có thể được thể hiện là
int *example;
Hoặc các điểm mẫu cho một int. Để lấy các mục trong mảng, bạn thêm số chính xác vào địa chỉ được lưu trữ trong ví dụ và đọc số ở địa chỉ bộ nhớ đó. Nếu chúng ta giả định bộ nhớ nhìn như
Memory Address = Value (ints take up 4 bytes of space)
1000 = 1 <-- example
1004 = 2
1008 = 3
1012 = 4
1016 = 5
Vì vậy
int i = example[3]; //The 4th element
có thể được diễn tả như
int i = *(example + 3 * sizeof(int));
int i = *(example + 3 * 4);
int i = *(1000 + 12);
int i = *(1012); // Fetch the value at memory location 1012
int i = 4;
Các sizeof (int) là 4 (int là 32 bit, hoặc 4 * 8 bit byte). Nếu bạn đang cố gắng làm thêm, bạn sẽ muốn có một char là 8 bit hoặc 1 * 8 bit byte.
Vì vậy, trở lại bạn mã
char* p; // declare p as a pointer to a char/
p = (char *)a; // point p at memory location 3000
// p[b] would be the 21st element of the "array" p =>
// p[20] =>
// p + 20 * sizeof(char) =>
// p + 20 * 1 =>
// p + 20 =>
// 3000 + 20 =>
// 3020
// the & operator in c gets the address of the variable so
sum = (int) &p[b];
// &p[b] => find the address pointed to by p[b] => 3020
// (int) casts this pointer to a int.
Vì vậy, số tiền được gán địa chỉ của phần tử thứ 21 của mảng.
Giải thích kéo dài.
Nguồn
2012-06-28 13:10:36
Trông giống như một hoạt động trên bit. Bạn có thể xem nhanh http://www.cprogramming.com/tutorial/bitwise_operators.html để biết thêm thông tin –
Xin lỗi, nhưng điều này không hề chút nào. Mã IS được giả tạo, nhưng bạn sẽ hiểu nó nếu bạn đọc một chút về số học con trỏ (đặc biệt là toán tử []). Nếu bạn đang đi để chương trình trong C, điều này chắc chắn sẽ có giá trị trong khi của bạn. –
Xem thêm: [Làm cách nào để thêm hai số không có toán tử +?] (Http://stackoverflow.com/questions/4679556/how-do-i-add-two-numbers-without-the-operator) – Mysticial