a[i][j] = *(*(a+i)+j)
a的地址:0x7fff5594a0c0
a+1的地址:0x7fff5594a0cc
p:在列上移动
a:在行上移动
a: 行指针;*(a+i): 行指针变列指针;*(a+i)+j :行指针变列指针,再移动j列
book@100ask:~/C_coding/CH01$ cat 2d_arr.c
#include <stdio.h>
int main()
{
int a[2][3] = {1,2,3,4,5,6};
int i,j;
int *p;
// p = *a;
printf("%p %p\n",a,a+1);
for(i = 0; i < 2; i++)
{
for(j = 0; j < 3; j++)
{
printf("%p -> %d\n",*(a+i)+j,*(*(a+i)+j));
}
printf("\n");
}
}
book@100ask:~/C_coding/CH01$ make 2d_arr
cc 2d_arr.c -o 2d_arr
book@100ask:~/C_coding/CH01$ ./2d_arr
0x7ffff4442e00 0x7ffff4442e0c
0x7ffff4442e00 -> 1
0x7ffff4442e04 -> 2
0x7ffff4442e08 -> 3
0x7ffff4442e0c -> 4
0x7ffff4442e10 -> 5
0x7ffff4442e14 -> 6
book@100ask:~/C_coding/CH01$ cat 2d_arr1.c
#include <stdio.h>
int main()
{
int a[2][3] = {1,2,3,4,5,6};
int i,j;
int *p;
p = &a[0][0]; //此处只能将给p指定一个确定的地址值,不可用用 p = &a[i][j],因为此时a[i][j]未定,会报段错误
//二维变一维,p按列操作
for(i = 0; i < 6; i++)
{
printf("%p -> %d\n",p+i,p[i]);
}
printf("\n");
}
book@100ask:~/C_coding/CH01$ make 2d_arr1
cc 2d_arr1.c -o 2d_arr1
book@100ask:~/C_coding/CH01$ ./2d_arr1
0x7fff267a4470 -> 1
0x7fff267a4474 -> 2
0x7fff267a4478 -> 3
0x7fff267a447c -> 4
0x7fff267a4480 -> 5
0x7fff267a4484 -> 6
p的使用与a类似,但又不完全相同
p:指针变量
a:数组指针,移动一位移动一行
book@100ask:~/C_coding/CH01$ cat 2d_arr1.c
#include <stdio.h>
int main()
{
int a[2][3] = {1,2,3,4,5,6};
int i,j;
int *p = *a;
int (*q)[3] = a;
printf("%p %p\n",a,a+1);
printf("%p %p\n\n",q,q+1);
for(i = 0; i < 2; i++)
{
for(j = 0; j < 3; j++)
{
printf("%p -> %d\n",*(q+i)+j,*(*(q+i)+j));
}
printf("\n");
}
}
book@100ask:~/C_coding/CH01$ make 2d_arr1
cc 2d_arr1.c -o 2d_arr1
book@100ask:~/C_coding/CH01$ ./2d_arr1
0x7ffde7ea8980 0x7ffde7ea898c //证明,a的用法与q的用法一样
0x7ffde7ea8980 0x7ffde7ea898c
0x7ffde7ea8980 -> 1
0x7ffde7ea8984 -> 2
0x7ffde7ea8988 -> 3
0x7ffde7ea898c -> 4
0x7ffde7ea8990 -> 5
0x7ffde7ea8994 -> 6
book@100ask:~/C_coding/CH01$ cat 2d_arr1.c
#include <stdio.h>
int main()
{
int a[2][3] = {1,2,3,4,5,6};
int i,j;
int *p = *a;
int (*q)[3] = a;
printf("%p %p\n",a,a+1);
printf("%p %p\n\n",q,q+1);
for(i = 0; i < 2; i++)
{
for(j = 0; j < 3; j++)
{
printf("%p -> %d\n",*(a+i)+j,*(*(a+i)+j));
}
printf("\n");
}
}
book@100ask:~/C_coding/CH01$ make 2d_arr1
cc 2d_arr1.c -o 2d_arr1
book@100ask:~/C_coding/CH01$ ./2d_arr1
0x7ffd22414ff0 0x7ffd22414ffc
0x7ffd22414ff0 0x7ffd22414ffc
0x7ffd22414ff0 -> 1
0x7ffd22414ff4 -> 2
0x7ffd22414ff8 -> 3
0x7ffd22414ffc -> 4
0x7ffd22415000 -> 5
0x7ffd22415004 -> 6