详解C语言数组指针

数组指针与一维数组

数组指针指向的是数组整体,移动的是一个数组的整体空间大小

定义:数据类型 (*变量名) [一维数组元素的个数]
如果不加(),变量名先和[]去结合,变成数组,然后再和*去结合,变成指针,最终变成指针数组
[]的优先级比*的高
例如:

int a[5];
int (*p)[5] = &a;

数组指针和指针数组

数组指针:他是一个指针,指向了一个数组 int (*p)[5]
指针数组:他是一个数组,里面存放的都是指针 int *p[5]

数组指针的赋值与地址解析

使用取地址符&来获取数组整体的地址,即&数组名
例如:

#include <stdio.h>

int main()
{
	int a[5] = {0};
	int (*p)[5]= &a;

	printf("数组变量名地址:%p\n", a);
	printf("数组元素a[0]的地址:%p\n", &a[0]);
	printf("数组元素a[1]的地址:%p\n", &a[1]);
	printf("对a数组取地址:%p\n", &a);
	printf("数组指针保存的地址:%p\n", p);
	printf("数组指针跨越此数组空间的地址:%p\n", p+1);
	return 0;
}

在这里插入图片描述

数组指针的运算

  • p+1:往地址增大的方向移动一个数组空间大小,p的指向没有改变
  • p-1:往地址减小的方向移动一个数组空间大小,p不改变
  • p++:增大的方向一个数组空间大小,p的指向已经改变
  • p–:减小的方向移动一个数组空间大小,p改变

用数组指针输入输出元素

#include <stdio.h>

int main()
{
	int a[5];
	int (*p) [5];
	p = &a;
	printf("输入:");
	for(int i = 0; i < 5; i++)
	{
		// *p + i 获取整体空间中的第i+1个空间的地址
		// 可以看出一个数组空间空有许多个int型的小空间
		scanf("%d", *p + i);
	}
	printf("输出结果:");
	for(int i = 0; i < 5; i++)
	{
		// *p + i是一个地址
		// 所有用*来取得地址里的值
		printf("%d ", *(*p + i));
	}
	printf("\n");
	return 0;
}

在这里插入图片描述

数组指针和二维数组

二维数组的本质:数组元素是一维数组的一维数组

数组指针指向的是二维数组整体,移动的是一个二维数组的整体空间大小

定义:数据类型 (*变量名) [二维数组元素的元素的个数]
举例:

int a[2][3];
int (*p)[3]; // 定义一个数组指针

数组指针的赋值与地址解析

使用数组名来获取数组的地址,即数组名
相关地址理解
在这里插入图片描述
例如:

#include <stdio.h>

int main()
{
	int a[2][3] = {{1, 2, 3}, {9, 8, 7}};
	int (*p)[3] = a;

	printf("a[0][0]的地址:%p\n", &a[0][0]);
	printf("a[0][1]的地址:%p\n", &a[0][1]);
	printf("数组a[0]的地址:%p\n", a[0]);
	printf("数组a[1]的地址:%p\n", a[1]);
	printf("数组a[2][3]的首地址:%p\n", &a[0]);
	printf("数组a[2][3]的第二个元素的地址:%p\n", &a[1]);
	printf("整个空间的地址:%p\n", &a);
	printf("指针的地址:%p\n", p);
	printf("下一个整体空间的地址:%p\n", &a + 1);
	return 0;
}

在这里插入图片描述

用数组指针输入输出元素

#include <stdio.h>

int main()
{
	int a[2][3];
	int (*p)[3];
	p = a;
	printf("输入数据:\n");
	for(int i = 0; i < 2; i++)
	{
		for(int j = 0; j < 3; j++)
		{
			scanf("%d", *(p+i)+j);
		}
	}
	printf("输出数据:\n");
	for(int i = 0; i < 2; i++)
	{
		for(int j = 0; j < 3; j++)
		{
			printf("%d ", *(*(p+i)+j));
		}
		printf("\n");
	}
	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值