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