使用双指针实现二维数组 [英] Two Dimensional Array Implementation Using Double Pointer

查看:40
本文介绍了使用双指针实现二维数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

请考虑以下代码:

#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, so ptr+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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆