请考虑以下代码:
#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 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]来读取.