C-指针和二维数组
在本教程中,我们将学习使用C编程语言中的指针来处理二维数组。
在上一教程"指针和一维数组"中,我们学习了如何使用一维字符数组。
随时查看该教程。
创建一个二维数组
为了简单起见,我们将创建一个二维整数数组" num",该数组具有3行4列。
int num[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} };
在上图中,我们显示了具有3行4列的二维数组。
编译器将按行为上述二维数组分配内存,这意味着第二行的第一个元素将放置在第一行的最后一个元素之后。
而且,如果我们假设数组的第一个元素在地址1000处并且类型为int的大小为2个字节,则数组的元素将获得以下分配的内存位置。
创建二维数组的指针
我们已经创建了二维整数数组" num",因此我们的指针也将是" int"类型。
我们将使用"&"运算符的地址将数组" num"的第一个元素的地址分配给指针" ptr"。
int *ptr = &num[0][0];
通过指针访问二维数组的元素
二维数组" num"将作为连续块保存在内存中。
因此,如果将ptr的值增加1,我们将移至分配的内存中的下一个块。
在下面的代码中,我们使用" for"循环并通过增加" ptr"的值来打印" num"数组的内容。
#include <stdio.h> int main(void) { //2d array int num[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} }; //pointer ptr pointing at array num int *ptr = &num[0][0]; //other variables int ROWS = 3, COLS = 4, TOTAL_CELLS = ROWS * COLS, i; //print the elements of the array num via pointer ptr for (i = 0; i < TOTAL_CELLS; i++) { printf("%d ", *(ptr + i)); } return 0; }
1 2 3 4 5 6 7 8 9 10 11 12
地址映射
我们可以通过使用数组的行和列来计算数组元素的地址。
为此,我们使用以下公式。
arr[i][j] = baseAddress + [(i x no_of_cols + j) x size_of_data_type]
其中," arr"是二维数组。
i和j表示数组的第i行和第j列。
baseAddress表示数组的第一个元素的地址。
而" no_of_cols"是该行中的总列数。
而size_of_data_type是指针类型的大小。
如果类型为" int",则size_of_data_type = 2个字节,如果类型为" char",则size_of_data_type = 1个字节。
例如,对于" num"数组,baseAddress = 1000,no_of_cols = 4,size_of_data_type = 2。
因此,我们可以如下计算元素num [2] [3]的内存地址位置。
//address of element at cell 2,3 num[2][3] = baseAddress + [(i x no_of_cols + j) x size_of_data_type] = 1000 + [(2 x 4 + 3) x 2] = 1000 + [(8 + 3) x 2] = 1000 + 22 = 1022
通过使用数组的行和列的指针访问二维数组的值
如果要在数组的任何给定行,列中获取值,则可以在" *"运算符的地址和以下公式中使用该值。
arr[i][j] = *(ptr + (i x no_of_cols + j))
其中," arr"是二维数组," i"和" j"表示数组的第i行和第j列。
ptr保存数组第一个元素的地址。
no_of_cols表示数组行中的列总数。
在下面的示例中,我们在数组num的第二行和第三列的位置找到值。
//value at num[2][3] where, i = 2 and j = 3 num[2][3] = *(ptr + (i x no_of_cols + j)) = *(ptr + (2 x 4 + 3)) = *(ptr + 11)
完整的代码
#include <stdio.h> int main(void) { //2d array int num[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} }; int ROWS = 3, COLS = 4, i, j; //pointer int *ptr = &num[0][0]; //print the element of the array via pointer ptr for (i = 0; i < ROWS; i++) { for (j = 0; j < COLS; j++) { printf("%d ", *(ptr + i * COLS + j)); } printf("\n"); } return 0; }
1 2 3 4 5 6 7 8 9 10 11 12