C語言基礎 -36 指針_二維數組

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章