请考虑以下代码:
#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 + 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
这是我的第一句话。