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

猜你喜欢

转载自blog.csdn.net/f2157120/article/details/106883400