c – 使用双指针实现二维数组

请考虑以下代码
#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 ("\nMemory Allocation Failure !\n\n");
      exit (EXIT_FAILURE);
   }

   for (index=0; index<NUM_ARRAYS; index++)
   {
      *(ptr+index) = malloc(sizeof(int)*NUM_ELEMENTS); 

      if (!*(ptr+index))
      {
         printf ("\nMemory Allocation Failure !\n");
         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 ("\nArray %d Elements:\n",index);
      for (array_index = 0; array_index<NUM_ELEMENTS; array_index++)
      {
         printf (" %d ",*(*(ptr+index)+array_index));
      }
      printf ("\n\n");
   }

   return 0;
}

我的代码没有问题.它工作正常.

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

我有一个关于指针算术的问题:

*(ptr 0)=指向COMPLETE BLOCK的指针(第一个数组)
*(ptr 1)=指向COMPLETE BLOCK(第二个数组)的指针.

但是:(* 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

我对此感到困惑.请给我一些解释来解决这个疑问.

解决方法

*(ptr i)等于ptr [i]和
*(ptr 1)是ptr [1].

你可以认为,二维数组是数组的数组.

> ptr指向完成2-D数组,因此ptr 1指向下一个2-D数组.

在下图中,ptr是2-D,列数是3

由Kerrek SB先生制作的原始图,here,您还应该检查!

+===============================+==============================+====
|+---------+----------+--------+|+----------+---------+--------+|
||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指向完成2-D.

* ptr = *(ptr 0)=第一行的ptr [0].

* ptr 1 = ptr [1]表示第二行

*(* 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]来读取.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...