数组指针与指针数组

一、数组指针

数组指针,即是指向数组的指针,数组指针中存放的应该是数组的地址

1. 数组名的区分
数组名:数组名就是数组的最大存储单元的首地址,指向第一个元素,所以数组名的类型为元素类型的指针
&数组名[0]:第一个元素的首地址,和数组名的值,以及含义都一模一样
&数组名:整个数组的首地址,指向的是整个数组,与上面两者值一样,但是含义却不一样

2. 一维数组指针的使用
图解

数组指针的定义是例如:int(*p)[3]=NULL;

int main()
{
	int(*p)[4] = NULL;//数组指针定义
	int arr[4] = { 1, 2, 3, 4 };
	p = &arr;//类型为int(*)[]
	printf("%d %d %d %d\n", p, p + 1, p + 2, p + 3);//跳过整个数组
	printf("%d %d %d %d\n", &arr, &arr + 1, &arr + 2, &arr + 3);//每个元素地址
	printf("%d %d %d %d\n",arr,arr+1,arr+2,arr+3);//每个元素地址
	printf("%d %d %d %d\n", *p, *p + 1, *p + 2, *p + 3); //每个元素地址
	printf("%d %d %d %d\n", *arr, *(arr + 1),*( arr + 2), *(arr + 3));//对每个元素地址进行解引用,即取出该地址中的数据
	printf("%d %d %d %d\n",*(*p),*(*p+1),*(*p+2),*(*p+3));//对每个元素地址进行解引用,即取出该地址中的数据
	return 0}

3. 二维数组指针的应用
二维数组指针与一维数组指针的应用有些差别,因为二维数组的每个元素都是一维数组,所以最大的存储单元应该是一个指向一维数组的指针。所以不用对二维数组取地址。

在这里插入图片描述

//二维数组的每个元素都是一维数组,所以最大的存储单元应该是一个指向一维数组的指针
	int(*pp)[4] = NULL;
	int str[2][4] = { 1, 2, 3, 4 ,5,6,7,8};
	pp = str;//类型为int*  注意不能取地址
	printf("%d %d\n",pp,pp+1);//跳过一个一维数组的长度
	printf("%d %d\n", str, str + 1);//跳过一个一维数组的长度
	printf("%d %d %d %d\n", *pp, *(pp + 1));//取第一行,第二行的第一个地址
	printf("%d %d %d %d\n", **pp, *(*pp + 1), *(*pp + 2), *(*pp + 3));//第一行的每个元素
    printf("%d %d %d %d\n", **(pp+1), *(*(pp + 1) + 1), *(*(pp + 1) + 2), *(*(pp + 1) + 3));//第二行的元素输出

二、指针数组

指针数组是每个元素都是指针的数组。存储类型为int*这样的指针;


//指针数组
int main()
{
	int* p[2] = { NULL };//指针数组中每一个都是指针,
	//方法1
	int* a = NULL;
	int b = 6;
	a = &b;
	p[0] = a;
	printf("%d\n",*p);
	printf("%d\n",a);
	//方法2用动态内存分配
	for (int i = 0; i < 2; i++)
	{
		p[i] = (int*)calloc(1,sizeof(int));//开辟4个字节空间
		if (p[i] == NULL)//判断是否成功
		{
			printf("开辟空间失败 %d",i);
			return -1;
		}
		*p[i] = i;//赋值
	}
	for (int i = 0; i < 2; i++)
	{
		printf("%d ",*p[i]);
	}
	while (1);
	return 0;
}

三、数组指针与指针数组的区别

指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身的大小决定(如自己动态开辟空间),每一个元素都是一个指针。它是“储存指针的数组”的简称。
数组指针:首先它是一个指针,它指向一个数组。至于它指向的数组占多少字节,不知道,具体要看数组大小。它是“指向数组的指针”的简称。

  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值