用双指针实现二维数组 请考虑以下代码: #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; }

用双指针实现二维数组 请考虑以下代码: #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; },c,multidimensional-array,double-pointer,C,Multidimensional Array,Double Pointer,我有一个关于指针运算的问题: *(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 (gdb) p *(*ptr+1) $1 = 2 我对此感到困惑。请给我一些解释来解决这个疑问。除非您键入错误,(*p

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

*(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
(gdb) p *(*ptr+1)
$1 = 2  

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

除非您键入错误,
(*ptr+1)
相当于
*(ptr+0)+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
指向完成二维

*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
(gdb) p *(*ptr+2)
$2 = 3
(gdb) p *(*ptr+3)
$3 = 4
(gdb) p *(*ptr+4)
$4 = 0
(gdb) p *(*ptr+1)
$1 = 2  
这是正确的
2
可以使用
ptr[0][1]
读取

                                 (*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
是指向第一个子数组中第二个元素的指针

使用指针创建二维数组、赋值和访问数组中的元素的最简单方法

#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");
}
}
#包括
#包括
int main()
{
int i,j;
int row,col;
printf(“输入行和列的值:\n”);
scanf(“%d%d”,行和列);
int**arr=(int**)malloc(行*(大小)(int*));

for(i=0;i
*ptr+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[0][1]==*ptr+1

这是我的第一句话。

我在这段代码中没有看到
(*ptr+1)
。不,它不在那里。这是我在写了这段代码后对概念的怀疑。我理解*(ptr+1)没有问题。事实上,我自己写了上面的代码。我的问题是{*(ptr)+1}谢谢Grijesh。但是gdb显示了一个不同的输出。我正在更新我的问题,以包括*(*ptr+1)的gdb O/P。不。我仍然不清楚。我还希望(*ptr)+1可以到第二个数组块,但它将到第一个数组的第二个元素(在上面的问题中添加了gdb输出)@Sandepsing:请检查“知道它”,我希望现在你能理解它。@Sandepsing现在的状态是什么不,我没有打错。我对{(*ptr)+1}感到困惑。你的解释是正确的(由GDB验证)。但根据我的理解,*ptr=指向第一个数组块的指针,而不是指向任何单个元素。然后,(*ptr+1)可能已经到了第二个数组的开头。请澄清这个疑问。+1对于你的答案,你的数字比my.Kallel清楚得多。如何绘制这个图?你使用过任何工具吗?是的。你已经简化了双指针的赋值。但是在理解双指针时,这种简单是非常危险的。从在这段代码中,许多人可以得出结论,指向变量的双指针类似于二维数组。但指向变量的双指针不同于二维数组。