【C语言】指针进阶第二站:指针数组!

点击蓝字

9cb022749b53d00170e785a4abfc0a64.png

关注我们

指针数组

数组是一种类型的数的集合

整型数组的元素都是int类型

指针数组的元素都是指针变量

int* arr1[10];//整型指针的数组


char*arr2[10];//一级字符指针的数组


char** arr3[5];//二级字符指针的数组

参考这一份示意图

484532a84b435124636de956f7550469.png

示例1:定义多个字符指针

在上一站的字符指针里面,提到了可以直接用指针来创建一个常量字符串

同理,我们可以将多个指针放在一块,凑成指针数组,一次性创建多个指向常量字符串的指针

5f94151ce40c2696e7d115e512e110a8.png

int main()
{
char* arr[] = { "abcdef", "qwer", "zhangsan" };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);


for (i = 0; i < sz; i++)
  {
printf("%s\n", arr[i]);
  }
return 0;
}
示例2:存放数组名的数组

在之前的学习中,我们知道:数组名代表数组首元素的地址

可以说,数组名本质上也是一个指针

既然是指针,就能放进指针数组里面

int main()
{
int arr1[] = { 1,2,3,4,5 };
int arr2[] = { 2,3,4,5,6 };
int arr3[] = { 3,4,5,6,7 };


int* arr[] = {arr1, arr2, arr3};
//arr是指针数组
int i = 0;
for (i = 0; i < 3; i++)
  {
int j = 0;
for (j = 0; j < 5; j++)
    {
printf("%d ", arr[i][j]);//*(*(arr+i)+j)
    }
printf("\n");
  }


return 0;
}

这串代码中,我们需要了解的是arr[i][j]和*(*(arr+i)+j)之间的关系

以下内容若有错误,还请大家在评论区指正!

arr[i][j]和*(*(arr+i)+j)
它们都是访问数组的形式,用到了不同的操作符
但表达的含义相同:下标为i、j的元素

在内存中,数据的存储是连续的

创建一个二维数组,可以看到两行的数据是连续存放在数组里面的

int arr4[2][2]={{1,2},{3,4}};

既然是连续的,我们就可以用指针++的形式来访问二维数组里面的所有元素

*(arr+i)指向第i行元素
*(arr+i)+j指向第i行下标为j的元素的地址
*(*(arr+i)+j)再次解引用,得到j元素

数组名的本质是地址,是该数组首元素的地址

二维数组的首元素是第一行,数组名arr就是第一行的地址

我们可以把二维数组的每一行理解为独立的一个一维数组

这时候,二维数组的形式和上述代码中int* arr[]数组的形式就相同了

int arr1[] = { 1,2,3,4,5 };
int arr2[] = { 2,3,4,5,6 };
int arr3[] = { 3,4,5,6,7 };
//arr1 arr2 arr3是二维数组里面的每一行
int* arr[] = {arr1, arr2, arr3};
//arr等价于一个二维数组,但有不同

int* arr[]和二维数组的不同

int*arr数组里的元素arr1,arr2,arr3的地址是连续存放的

这里设计到一个新概念:数组指针

将在下一节讲解!

5263240da15b713f5ab57038f8dcaac7.png

但是它们对应的各自的数组内数据并不连续

如:arr1和arr2这两个数组各自元素的地址并不连续

46af592df9ee9e787c377f4eb4d4e953.png

示例3:存放二级指针的数组

既然一级指针可以放进数组里,二级指针也是指针,同样也能塞进数组里

下面这串代码里面的arr2就是一个存放二级指针的数组

#include <stdio.h>
int main()
{
int a = 10;
int* p = &a;
int** pp = &p;
int** arr2[4] = {pp};


return 0;
}

你学会了吗?下次给大家分享数组指针哦!

*声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

8883446aa962a685a2cdcbfbdcef99cb.png

dfc7c5d55180a18a8eafc2da9dadb0b6.gif

戳“阅读原文”我们一起进步

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值