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 !nn");
      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 ("nn");
   }
   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) = 指向完整块(第一个数组(
的指针 *(ptr+1) = 指向完整块(第二个数组(的指针。

但什么是:(*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)      (*ptr+1)     (*ptr+2)
                                   |            |            |
             __________      ______v____________v____________v____________
  ptr------>|   *ptr   |--->|  *(*ptr)   |  *(*ptr+1)  |*(*ptr+2) |       |
            |__________|    |____________|_____________|__________|_______|
 (ptr+1)--->| *(ptr+1) |     ____________ _____________ __________________
            |__________|--->|*(*(ptr+1)) |*(*(ptr+1)+1)|          |       |
            |          |    |____________|_____________|__________|_______|
            |__________|          ^             ^
                                  |             |
                              *(ptr+1)     *(ptr+1)+1

带有双指针的 2D 数组,这意味着您有一个主数组,主数组的元素是指向子数组的指针(或地址(。如上图所示

因此,如果您已将双指针定义为此 2D 数组的指针,则假设int **ptr

因此,ptr将绑定到主数组,该数组将包含指向子数组的指针。 ptr 是主数组,这意味着ptr指向主数组的第一个元素,因此ptr + 1指向主数组的第二个元素。

*ptr这意味着ptr指向的第一个元素的内容。它是指向子数组的指针。所以*ptr是指向第一个子数组的指针(子数组是int数组(。所以*ptr指向第一个子数组中的第一个元素。所以*ptr + 1是指向第一个子数组中第二个元素的指针

*(ptr+i)等于

ptr[i]*(ptr+1) ptr[1].

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

  • ptr指向完整的二维阵列,因此ptr+1指向下一个二维阵列。

下图中ptr是二维的,列数3

Kerrek SB先生制作的原始手办,在这里,您也应该检查一下!

+===============================+==============================+====
|+---------+----------+--------+|+----------+---------+--------+|
||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]读取。

使用指针创建 2-dimensinal 数组、赋值和从数组访问元素的最简单方法。

#include<stdio.h>
#include<stdlib.h>
int main()
{
int i,j;
int row,col;
printf("Enter the values for row and col:n");
scanf("%d%d",&row,&col);
int **arr=(int**)malloc(row*(sizeof(int*)));
for(i=0;i<row;i++)
{
    *(arr+i)=(int*)malloc(sizeof(int)*col);
            //You can use this also. Meaning of both is same.
            //arr[i]=(int*)malloc(sizeof(int)*col);
}
for(i=0;i<row;i++)
for(j=0;j<col;j++)
{
    arr[i][j]=0;
}
for(i=0;i<row;i++)
{
    for(j=0;j<col;j++)
    {
        printf("%d ",arr[i][j]);
    }
    printf("n");
}
}

除非你输入错误,否则(*ptr + 1)等效于*(ptr + 0) + 1,后者是指向第一个块中第二个元素的指针。

*ptr + 1ptr[0][1]的地址

因为,我们知道

ptr[0][1] == *(*(ptr+0)+1)

现在把和号放在两边

&ptr[0][1] == &*(*(ptr+0)+1)

你知道带星号的 & 符号就像带减号的加号吗?他们被取消了。所以这变成了

&ptr[0][1] == (*(ptr+0)+1)

这与

&ptr[0][1] == *(ptr+0)+1

这又与

&ptr[0][1] == *ptr+1

这是我的第一句话。

相关内容

  • 没有找到相关文章

最新更新