【C语言进阶】指针数组 —— 数组指针

C/C++
192
0
0
2024-02-25

⛺️生活的理想,就是为了理想的生活!

文章目录
  • 📋 前言
  • 💬 指针数组
  • 💭 指针数组的定义
  • ✅ 指针数组的使用
  • 🔰 如何访问存放在的指针数组里的数组元素
  • 💬 数组指针
  • 💭 数组指针的定义
  • 💭 &数组名VS数组名
  • 💭 数组指针的使用
  • 📖 数组指针(实例)
  • 📝全篇总结

📋 前言

🌈hello! 各位宝子们大家好啊,前面我们已经把指针大部分内容给学完了,今天就给大家带来数组指针or指针数组! ⛳️很多说这俩名字不是差不多嘛?那么肯定是一个意思,诶这里可不敢理解一样!数组指针or指针数组是有明显不一样的下面我们就来看看

💬 指针数组

⛳️ 指针数组是指针还是数组?这是我们想问的问题!其实我们可以采用类比的方法进行比较,比如说 整形数组指针数组 俩个命名只有前面两个字不一样。
  • 整形数组 是用来存放整形的数组
  • 指针数组 自然是用来存放指针(地址)的数组
  • 这样比较起来是不是就能快速的理解指针数组的概念!

💭 指针数组的定义

数组我们已经知道整形数组,字符数组。那么指针数组该怎么定义呢?其实也非常简单。
  • 既然 字符数组 是这样定义的 char arr1[ 3 ]
  • 那么 指针数组 也是一样的 char* p[ 3 ] = {arr1,NULL,NULL};
  • 只需要把类型定义为我们想要存储的指针类型就好了

📚 代码演示:

#include <stdio.h>
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "hello world";
	char arr3[] = "cuihua";

	char* parr[] = { arr1, arr2, arr3 };
	return 0;
}
✅ 指针数组的使用
⛳️ 指针数组的使用和数组的使用一模一样,只需要循环遍历就行了
  • 而如何想访问字符数组的元素就需要和二级指针

在这里插入图片描述

📚 代码演示:

#include <stdio.h>
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "hello world";
	char arr3[] = "cuihua";

	//指针数组
	char* parr[] = { arr1, arr2, arr3 };
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		printf("%s\n", parr[i]);
	}
	return 0;
}

📑 代码结果:

在这里插入图片描述

🔰 如何访问存放在的指针数组里的数组元素
我们既然可以利用指针数组去打印存放在 指针数组里面的数组元素,那么肯定可以去访问数组里面的元素!
  • prr[ 0 ] 可以访问指针数组里面的第一个数组
  • 既然能找到第一个数组那继续按照数组遍历里面的内容就OK了
  • par[ 0 ][ 0 ] 这个意思是找到指针数组里面存放的第一个数组的第一个元素
  • 看一下图其实大家就懂了

在这里插入图片描述

📚 代码演示:

#include <stdio.h>
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 2,3,4,5,6 };
	int arr3[] = { 3,4,5,6,7 };
	//指针数组
	int* parr[] = { arr1, arr2, arr3 };
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 5; j++)
		{			
			printf("%d ", parr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

📑 代码结果:

在这里插入图片描述

💬 数组指针

⛳️ 指针数组我们学完了那么,数组指针大家也可以理解理解!整形指针是用来存放整形地址的指针,那么数组指针是用来干什么呢?
  • 所以数组指针是用来存放数组的地址的指针指针变量。

💭 数组指针的定义

⛳️大家都知道 int* p1[10] 指针数组是这样定义的。那么数组指针该怎么定义的 其实是这样的 int (*p2)[10];,这就是数组指针的定义
  • 其实可以把 (*p2)里面的 * 说明了 p2是个指针变量
  • 而 int ()[10] 则说明了 p2 指向的是个数组

🔥 注:[ ]的优先级要高于号的,所以必须加上()来保证p先和结合。

📚 代码演示:

#include <stdio.h>
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int (*p)[5] = &arr1;
	return 0;
}

💭 &数组名VS数组名

⛳️ 数组指针的定义我们知道怎么定义了那么,该如何给数组指针符值呢?既然要给数组指针赋值那么我们先了解&数组名VS数组名有什么区别!
  • 我们来看一下这段代码

📚 代码演示:

#include <stdio.h>
int main()
{
 int arr[10] = {0};
 printf("%p\n", arr);
 printf("%p\n", &arr);
 return 0;

📑 代码结果:

在这里插入图片描述

诶,很多铁汁们一看就会发现这俩地址是一样,难道两个是一样的吗?
  • 我们知道arr是数组名,数组名表示数组首元素的地址。
  • 那么&arr到底代表了什么? 下面在看这段代码大家就明白了!

📚 代码演示:

#include <stdio.h>
int main()
{
 int arr[10] = { 0 };
 printf("arr = %p\n", arr);
 printf("&arr= %p\n", &arr);
 printf("arr+1 = %p\n", arr+1);
 printf("&arr+1= %p\n", &arr+1);
 return 0;
}

📑 代码结果:

在这里插入图片描述

从这里其实就可以看到,&arr+1 跳过的是整个数组的地址。而 arr 只是数组首元素的地址总结:

  • &arr 表示的是数组的地址,而不是数组首元素的地址。
  • 本例中 &arr 的类型是: int(*)[10] ,是一种数组指针类型
  • 数组的地址+1,跳过整个数组的大小,所以 &arr+1 相对于 &arr 的差值是40

💭 数组指针的使用

⛳️介绍了这么多终于来到了指针数组的使用了,我们下面就给大家演示一遍吧!

📚 代码演示:

#include <stdio.h>
int main()
{
 int arr[10] = {1,2,3,4,5,6,7,8,9,0};
 int (*p)[10] = &arr;//把数组arr的地址赋值给数组指针变量p
 //但是我们一般很少这样写代码一般都是在函数里面接收数组时使用
 return 0;
}

📑 代码结果:

这里我们就可以看到如果接收整个指针数组的地址,使用的指针级别出现问题程序就会崩溃!

在这里插入图片描述

📖 数组指针(实例)
⛳️这里我们就采用指针数组介绍指针和普通的方法接收数组来演示一下。
  • =其实二维数组的本质就指针数组==

📚 代码演示:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void print_arr1(int arr[3][5], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
}
void print_arr2(int(*arr)[5], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
}
int main()
{
	int arr[3][5] = { 1,2,3,4,5,6,7,8,9,10 };
	print_arr1(arr, 3, 5);
	//数组名arr,表示首元素的地址
	//但是二维数组的首元素是二维数组的第一行
	//所以这里传递的arr,其实相当于第一行的地址,是一维数组的地址
	//可以数组指针来接收
	print_arr2(arr, 3, 5);
	return 0;
}

📑 代码结果:

在这里插入图片描述

📝全篇总结

✅ 归纳: 好了以上就是关于 指针数组 or 数组指针 的全部区别和知识点已经讲解清楚了! 指针数组的定义与使用数组指针的概念数组名 or &数组名的区别数组指针的使用 ☁️ 好了这下关于 指针数组 or 数组指针的概念相信大家就有一定理解了,其实只要类比一下就很好掌握。