C语言-指针(和数组关系)

//数组和指针

	//数组和指针
	int a[5] = { 2, 4, 8, 1, 9 };
	int* p = a;
	//a++;  不可以自增   可以 (a + 1)  

	printf("%p, %p\n", &*(p + 1), &a[1]);// &*(p + 1)和(p+1)一样

	//下面这是合法的
	*(p + 2) == *(2 + p) == 2[p];

在这里插入图片描述
//指针数组

	int a = 1, b = 4, c = 3, d = 9, e = 0;
	int* n[5] = { &a, &b, &c, &d, &e };

	printf("%p\n", n[2]);//地址
	printf("%d\n", *n[2]);//数值

	int f = 10;
	//修改n[2]的值
	n[2] = &f;			//修改了n[2]的元素值,把地址修改了。f的地址赋值给了n[2]   地址变了,数值也变了
	//*n[2] = f;		//地址没有变,修改了地址指向的数值。%d n[2] 为 10 

	printf("%p\n", n[2]);//地址
	printf("%d\n", *n[2]);//数值

在这里插入图片描述
//拉链结构

	int a[3] = { 1, 2, 3 };
	int b[3] = { 8, 6, 7 };
	int c[3] = { 12, 48, 35 };

	int* n[3] = { a, b, c };
		
	printf("%d\n", *(n[1] + 1));//n[1][1]

在这里插入图片描述
//数组指针

	//数组指针
	int a[5] = { 1, 2, 3, 4, 5 };
	int (*p)[5] = &a;
	
	printf("%d\n", (*p)[2]);//3
	printf("%d\n", p[0][2]);//3

	printf("%p, %p\n", &a[2], &(*p)[2]);

在这里插入图片描述
//二维数组和指针

	//二维数组和指针
	int n[2][3] = { { 1, 2, 3 }, { 88, 99, 22 } };
	
	//指针指向二维数组元素
	int *p = &n[1][1];
	printf("%d\n", *p);

	//指针指向二维数组中的一维数组
	int (*p1)[3] = &n[0];
	printf("%d\n", (*p1)[1]);
	printf("%p,%p\n", &n[0][1],&(*p1)[1]);


	//指针指向二维数组
	int (*p3)[2][3] = &n;
	//分解
	//(*p3) == n;

	(*p3)[1][1] = 100;//修改n[1][1]的值
	printf("%d\n", (*p3)[1][1]);
	
	//遍历
	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			printf("%d\t", (*p3)[i][j]);
		}
		printf("\n");
	}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43340991/article/details/86541337