如果我在C:int B[4];
中声明一个数组,那么我可以通过B[2]
或&B[2]
得到指向B+2
地址的指针。
但是我说我声明了二维数组A[3][6]
如何使用指针算法而不是A[i][j]
来访问&A[i][j]
数组中的特定指针?
答案 0 :(得分:4)
请记住,在C中,A[i]
完全等同于*(A + i)
。 1 递归地应用该规则,然后就完成了。
<小时/> <子> 1。实际上,它相当于
(*((A) + (i)))
,但是更难以阅读......
答案 1 :(得分:0)
通过一个例子回答:
int A[3][6];
int i = 2;
int j = 4;
int* p = A[i]+j;
当然,由于任何数组都是连续的内存(在上面的示例中由18个int
元素组成),您也可以将其转换为简单的指针,然后引用您想要的任何元素。
例如:
int* p = (int*)A+i*6+j;
您可以使用以下任何一项计算确切的列数(上例中为6):
sizeof(*A)/sizeof(**A)
sizeof(A[0])/sizeof(A[0][0])
sizeof(A[x])/sizeof(A[y][z]) // x,y,z are any integer constants or variables
但你可以在数组的声明范围内安全地只(如果它是局部变量则为函数,如果是全局变量则为file)。
答案 2 :(得分:0)
以下是您想要做的事情的吹嘘说明。
int A[3][6];
int (*pointer_to_row_i_of_A)[6] = A + i;
int *row_i_of_A = *pointer_to_row_i_of_A;
int *pointer_to_row_i_column_j_of_A = row_i_of_A + j;
由于数组对象在此类表达式中使用时会降级为其第一个元素的地址值,因此取消引用指向数组的指针的工作方式如上所示。正如Oli's answer中所提到的,您可以通过删除上图中的临时值将其简化为单个表达式。
int *pointer_to_row_i_column_j_of_A = *(A + i) + j;