微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

原文地址:https://www.jb51.cc/c/117143.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐