C语言指向二维数组的指针
本帖最后由 u011741688 于 2013-09-24 23:59:26 编辑
for(i = 0;i
{
for(j = 0;j
printf("%d\t",*(p + i) + j);
printf("\n");
}
*(p + i) + j 等效于 array[i] + j
p + 0 + 0 == array[0] + 0 == array[0][0]
p + 0 == array[0]
*(*(p+i)+j) 这个要怎么去理解。
嗯嗯 多多指教,谢谢!!
二维数组
c语言
指针
分享到:
------解决方案--------------------
*(*(p+i)+j) 是 array[i][ j]
------解决方案--------------------
http://book.51cto.com/art/201207/348002.htm
------解决方案--------------------
*(*(p+i)+j)这是取i行j列的元素,计算机寻址方式都是按一维的,就是以这种方式*(*(p+i)+j)进行寻址,对于多维的数组,你若采用array[i][j],array[i][j][k]在有的编译器里面,就有可能取不到正确的值
------解决方案--------------------
char **p;
char A[M][N];
p = A;
p+i 是一个指针 指向 *(p+i)
*(p+i)还是一个指针 指向*(*(p+i))
*(p+i)+j 还是一个指针 指向*(*(p+i)+j)
*(*(p+i)+j) 就是具体的值了
p+i 对应 A+i
*(p+i) A[i]
*(p+i)+j 对应 A[i] +j
*(*(p+i)+j) 对应 A[i][j]
------解决方案--------------------
char *p; //指针
*p //表示只想的数据
char **p //指向指针的指针
//同理 *p //指向的数据(指针)
------解决方案--------------------
仅供参考//在堆中开辟一个4×5的二维int数组
#include
#include
int **p;
int i,j;
void main() {
p=(int **)malloc(4*sizeof(int *));
if (NULL==p) return;
for (i=0;i<4;i++) {
p[i]=(int *)malloc(5*sizeof(int));
if (NULL==p[i]) return;
}
for (i=0;i<4;i++) {
for (j=0;j<5;j++) {
p[i][j]=i*5+j;
}
}
for (i=0;i<4;i++) {
for (j=0;j<5;j++) {
printf(" %2d",p[i][j]);
}
printf("\n");
}
for (i=0;i<4;i++) {
free(p[i]);
}
free(p);
}
// 0 1 2 3 4
// 5 6 7 8 9
// 10 11 12 13 14
// 15 16 17 18 19
------解决方案--------------------
*(*(p+i)+j) 这个要怎么去理解。
类似与*(*(p+i+j));
*(p+i)+j ,已经是取了p+i+j的值吧,然后再加一个*,应该是错了吧!
------解决方案--------------------
*(*(p+i)+j) 等价于p【i】【j】,*(p+i)是第i行第零列元素的地址,也是i行的首地址,,因此*(p+i)
就成了列地址,*(p+i)+j就是第i行第j列元素的地址,再加上一个指向运算符*,就表示第i行第j列的元素了
------解决方案--------------------
C语言里面只有一维数组。
比如一个数组 a[4][5],20个元素,那么只要你的下标和在20以内都是合法的,比如a[1][10]...
*(*(p+i)+j),表示第i行j个元素
*(p+i)看做是一个指针,指向第i行的第一个元素,+j表示偏移j个元素,再解除引用*(*(p+i)+j)就是表示第i行j个元素