使用双指针实现二维数组 [英] Two Dimensional Array Implementation Using Double Pointer
问题描述
请考虑以下代码:
#include <stdio.h>
#include <stdlib.h>
#define NUM_ARRAYS 4
#define NUM_ELEMENTS 4
#define INVALID_VAL -1
int main()
{
int index = INVALID_VAL;
int array_index = INVALID_VAL;
int **ptr = NULL;
ptr = malloc(sizeof(int*)*NUM_ARRAYS);
if (!ptr)
{
printf ("
Memory Allocation Failure !
");
exit (EXIT_FAILURE);
}
for (index=0; index<NUM_ARRAYS; index++)
{
*(ptr+index) = malloc(sizeof(int)*NUM_ELEMENTS);
if (!*(ptr+index))
{
printf ("
Memory Allocation Failure !
");
exit (EXIT_FAILURE);
}
}
/* Fill Elements Into This 2-D Array */
for (index=0; index<NUM_ARRAYS; index++)
{
for (array_index = 0; array_index<NUM_ELEMENTS; array_index++)
{
*(*(ptr+index)+array_index) = (array_index+1)*(index+1);
}
}
/* Print Array Elements */
for (index = 0; index<NUM_ARRAYS; index++)
{
printf ("
Array %d Elements:
", index);
for (array_index = 0; array_index<NUM_ELEMENTS; array_index++)
{
printf (" %d ", *(*(ptr+index)+array_index));
}
printf ("
");
}
return 0;
}
我的代码没有问题.它工作正常.
There is no problem with my code. It works fine.
Output:
Array 0 Elements:
1 2 3 4
Array 1 Elements:
2 4 6 8
Array 2 Elements:
3 6 9 12
Array 3 Elements:
4 8 12 16
我有一个关于指针算法的问题:
I have a question about pointer arithmetic:
*(ptr+0)
= 指向完整块(第一个数组)的指针*(ptr+1)
= 指向完整块(第二个数组)的指针.
*(ptr+0)
= Pointer to COMPLETE BLOCK (First Array)
*(ptr+1)
= Pointer to COMPLETE BLOCK (Second Array).
但是什么是:(*ptr+1)
?
GDB 输出:
(gdb) p *(*ptr+1)
$1 = 2
(gdb) p *(*ptr+2)
$2 = 3
(gdb) p *(*ptr+3)
$3 = 4
(gdb) p *(*ptr+4)
$4 = 0
我对此感到困惑.请给我一些解释以解决这个疑问.
I am getting confused on this. Please provide me some explanation to resolve this doubt.
推荐答案
*(ptr+i)
等于 ptr[i]
并且*(ptr+1)
是 ptr[1]
.
*(ptr+i)
is equals to ptr[i]
and
*(ptr+1)
is ptr[1]
.
您可以将二维数组视为数组的数组.
You can think, a 2-D array as array of array.
ptr
指向完整的二维数组,所以ptr+1
指向下一个二维数组.
ptr
points to complete 2-D array, soptr+1
points to next 2-D array.
下图中ptr
为二维,列数为3
In figure below ptr
is 2-D and number of columns are 3
Kerrek SB 先生制作的原始图,这里 ,你也应该检查一下!
Original figure made by Mr. Kerrek SB, here , you should also check!
+===============================+==============================+====
|+---------+----------+--------+|+----------+---------+--------+|
||ptr[0,0] | ptr[0,1] | ptr[0,2]|||ptr[1,0] |ptr[1,1] | ptr[1,2]|| ...
|+---------+----------+--------+++----------+---------+--------++ ...
| ptr[0] | ptr[1] |
+===============================+===============================+====
ptr
*(*ptr+1) = *( ptr[0] + 1 ) = ptr[0][1]
了解以下内容:
ptr
指向完成二维.
*ptr = *(ptr + 0) = ptr[0]
即第一行.
*ptr + 1 = ptr[1]
表示第二行
*ptr + 1 = ptr[1]
means second row
*(*ptr+1) = *(*(ptr + 0) + 1 ) = *(ptr[0] + 1) = ptr[0][1]
Array 0 Elements:
1 2 3 4
和 GDB 输出:
(gdb) p *(*ptr+1)
$1 = 2
这是正确的2
这可以使用ptr[0][1]
读取.
that is correct 2
this can be read using ptr[0][1]
.
这篇关于使用双指针实现二维数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!