前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【C语言进阶】指针数组 —— 数组指针

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

作者头像
鸽芷咕
发布2023-12-25 14:45:25
1210
发布2023-12-25 14:45:25
举报
文章被收录于专栏:C++干货基地C++干货基地
在这里插入图片描述
在这里插入图片描述

🎬 鸽芷咕个人主页 🔥 个人专栏:《C语言进阶篇》《C语言初阶篇》

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


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

📋 前言

🌈hello! 各位宝子们大家好啊,前面我们已经把指针大部分内容给学完了,今天就给大家带来数组指针or指针数组! ⛳️很多说这俩名字不是差不多嘛?那么肯定是一个意思,诶这里可不敢理解一样!数组指针or指针数组是有明显不一样的下面我们就来看看 📚本期文章收录在《C语言初阶篇》,大家有兴趣可以看看呐! ⛺️ 欢迎铁汁们 ✔️ 点赞 👍 收藏 ⭐留言 📝!

🔥 注:本篇文章需要用到前一章内容二级指针的概念需要的可以去看看呢。《指针详讲》

💬 指针数组

  ⛳️ 指针数组是指针还是数组?这是我们想问的问题!其实我们可以采用类比的方法进行比较,比如说 整形数组指针数组 俩个命名只有前面两个字不一样。

  • 整形数组 是用来存放整形的数组
  • 指针数组 自然是用来存放指针(地址)的数组
  • 这样比较起来是不是就能快速的理解指针数组的概念!

💭 指针数组的定义

数组我们已经知道整形数组,字符数组。那么指针数组该怎么定义呢?其实也非常简单。

  • 既然 字符数组 是这样定义的 char arr1[ 3 ]
  • 那么 指针数组 也是一样的 char* p[ 3 ] = {arr1,NULL,NULL};
  • 只需要把类型定义为我们想要存储的指针类型就好了

📚 代码演示:

代码语言:javascript
复制
#include <stdio.h>
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "hello world";
	char arr3[] = "cuihua";

	char* parr[] = { arr1, arr2, arr3 };
	return 0;
}
✅ 指针数组的使用

⛳️ 指针数组的使用和数组的使用一模一样,只需要循环遍历就行了

  • 而如何想访问字符数组的元素就需要和二级指针
在这里插入图片描述
在这里插入图片描述

📚 代码演示:

代码语言:javascript
复制
#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 ] 这个意思是找到指针数组里面存放的第一个数组的第一个元素
  • 看一下图其实大家就懂了
在这里插入图片描述
在这里插入图片描述

📚 代码演示:

代码语言:javascript
复制
#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先和结合。

📚 代码演示:

代码语言:javascript
复制
#include <stdio.h>
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int (*p)[5] = &arr1;
	return 0;
}

💭 &数组名VS数组名

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

  • 我们来看一下这段代码

📚 代码演示:

代码语言:javascript
复制
#include <stdio.h>
int main()
{
 int arr[10] = {0};
 printf("%p\n", arr);
 printf("%p\n", &arr);
 return 0;

📑 代码结果:

在这里插入图片描述
在这里插入图片描述

诶,很多铁汁们一看就会发现这俩地址是一样,难道两个是一样的吗?

  • 我们知道arr是数组名,数组名表示数组首元素的地址。
  • 那么&arr到底代表了什么? 下面在看这段代码大家就明白了!

🔥 注:在上一章指针的运算我们详细讲解了,数组的地址是什么。《指针的运算》

📚 代码演示:

代码语言:javascript
复制
#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

💭 数组指针的使用

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

📚 代码演示:

代码语言:javascript
复制
#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;
}

📑 代码结果:

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

在这里插入图片描述
在这里插入图片描述
📖 数组指针(实例)

⛳️这里我们就采用指针数组介绍指针和普通的方法接收数组来演示一下。

  • =其实二维数组的本质就指针数组==

📚 代码演示:

代码语言:javascript
复制
#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 数组指针的概念相信大家就有一定理解了,其实只要类比一下就很好掌握 看到这里了还不给博主扣个: ⛳️ 点赞☀️收藏 ⭐️ 关注 💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖 拜托拜托这个真的很重要! 你们的点赞就是博主更新最大的动力! 有问题可以评论或者私信呢秒回哦。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-08-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 📋 前言
  • 💬 指针数组
    • 💭 指针数组的定义
      • ✅ 指针数组的使用
      • 🔰 如何访问存放在的指针数组里的数组元素
  • 💬 数组指针
    • 💭 数组指针的定义
      • 💭 &数组名VS数组名
        • 💭 数组指针的使用
          • 📖 数组指针(实例)
      • 📝全篇总结
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档