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

Posted 一起学编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言指针进阶第二站:指针数组!相关的知识,希望对你有一定的参考价值。

指针进阶的第二站:​​指针数组​​到了!

上车上车!

指针数组

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

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

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

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

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

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

参考这一份示意图

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

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

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

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的地址是连续存放的

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

将在下一节讲解!

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

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

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

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

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

#include <stdio.h>
int main()

  int a = 10;
  int* p = &a;
  int** pp = &p;
  int** arr2[4] = pp;

  return 0;

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

为了帮助大家,轻松,高效学习C语言/C++,给大家分享我收集的资源,从最零基础开始的,帮助大家在学习C语言的道路上披荆斩棘!

编程学习

微信公众号:C语言编程学习基地

以上是关于C语言指针进阶第二站:指针数组!的主要内容,如果未能解决你的问题,请参考以下文章

C语言进阶4——指针的进阶

C语言进阶笔记深入了解进阶指针

C语言进阶笔记深入了解进阶指针

C语言进阶笔记深入了解进阶指针

C语言进阶笔记深入了解进阶指针

C语言学习笔记(11)指针进阶