用双指针实现二维数组 请考虑以下代码: #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清楚得多。如何绘制这个图?你使用过任何工具吗?是的。你已经简化了双指针的赋值。但是在理解双指针时,这种简单是非常危险的。从在这段代码中,许多人可以得出结论,指向变量的双指针类似于二维数组。但指向变量的双指针不同于二维数组。