我已经声明了一个4维数组: int board[3][3][3][3]
我怎样才能获得指向子数组的指针,例如我尝试过这样的事情:
int sub_board[3][3] = board[1][2];
Run Code Online (Sandbox Code Playgroud)
但它没有用,我找不到任何方法来获得指向子数组的指针.
有两种方法可以获得指向子数组的指针:
int (*sub_board)[3][3] = &board[1][2];
Run Code Online (Sandbox Code Playgroud)
sub_board指向具有已知维度的子数组,但其元素必须取消引用为(*sub_board)[i][j].
或者,您可以使用指向子数组开头的指针,但没有嵌入的元素数量概念:
int (*sub_array)[3] = board[1][2];
Run Code Online (Sandbox Code Playgroud)
元素更直观地访问sub_array[i][j],但i在编译时无法静态检查范围.
以下是这些工作原理的说明.为清楚起见,我使用了不同尺寸的不同尺寸:
#include <stdint.h>
#include <stdio.h>
int main(void) {
int board[2][3][4][5];
int (*sub_board)[4][5] = &board[1][2];
int (*sub_array)[5] = board[1][2];
int n = 0;
for (int i0 = 0; i0 < 2; i0++) {
for (int i1 = 0; i1 < 3; i1++) {
for (int i2 = 0; i2 < 4; i2++) {
for (int i3 = 0; i3 < 5; i3++) {
board[i0][i1][i2][i3] = n++;
}
}
}
}
printf("board = %p\n", (void*)board);
printf("sub array board[1][2] should be at offset 1 * 3 * 4 * 5 + 2 * 4 * 5 = %d\n",
1 * 3 * 4 * 5 + 2 * 4 * 5);
printf("sub_board = %p\n", (void*)sub_board);
printf("offset = %lld\n", (long long int)(((intptr_t)sub_board - (intptr_t)board) / (int)sizeof(int)));
printf("sub_array = %p\n", (void*)sub_board);
printf("offset = %lld\n", (long long int)(((intptr_t)sub_array - (intptr_t)board) / (int)sizeof(int)));
printf("addressing using board:\n");
for (int i2 = 0; i2 < 4; i2++) {
for (int i3 = 0; i3 < 5; i3++) {
printf("%8d", board[1][2][i2][i3]);
}
printf("\n");
}
printf("\n");
printf("addressing using sub_board:\n");
for (int i2 = 0; i2 < 4; i2++) {
for (int i3 = 0; i3 < 5; i3++) {
printf("%8d", (*sub_board)[i2][i3]);
}
printf("\n");
}
printf("\n");
printf("addressing using sub_array:\n");
for (int i2 = 0; i2 < 4; i2++) {
for (int i3 = 0; i3 < 5; i3++) {
printf("%8d", sub_array[i2][i3]);
}
printf("\n");
}
printf("\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
76 次 |
| 最近记录: |