数组指针

简介: 数组指针

一、概念

下面哪个是数组指针?

int *p1[10];
int (*p1)[10];

int (*p)[10];

解释:p先和*结合,说明p是一个指针变量,然后指向一个大小为10的整型数组,所以p是一个指针,指向整型数组,叫做数组指针。

注意:【】的优先级要高于号,所以必须加上()保证先跟p结合,形成指针,不然就是一个整型数组。

举个例子:

double *d[5]

写出他的数组指针。

书写顺序:

  1. 先写指针,说明这是一个指针变量,注意要用括号括起来!(*pd)
  2. 然后写出指向数组的元素个数 (*pd)[5]
  3. 最后写出指向这个数组的类型,写在最前面。 double* (*pd)[5]

总结:

先写中间,后写两边

二、&数组名VS数组名

数组名只是单纯指向数组第一个元素的地址。

而&数组名是整个数组的地址

image.png

数组名+1跳过了一个元素,而&数组名+1直接跳过整个数组!

image.png

TIP:

数组名不是数组首元素地址的两个意外

1、sizeof(数组名)计算的是整个数组的大小,单位是字节

2、&数组名,表示整个数组,取的是整个数组的地址

三、数组指针的应用

一般用于二维数组的遍历。

代码的实现:

void print2(int (*p)[5],int r,int j)
{
  //p表示二维数组第一行的地址
  for (int i=0;i<r;i++)
  {
    for (int k=0;k<j;k++)
    {
      printf("%d ", *(*(p + i) + k));
    }
    printf("\n");
  }
}
int main()
{
  int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7 } };//二维数组的初始化
  print2(arr, 3, 5);//二维数组的首元素是第一行!
  return 0;
}

解析:

二维数组的数组名表示第一行数组的地址

所以p表示二维数组的第一行元素的地址,*(p+i)表示第几行,而*(*(p+i)+k)就表示每一行的每一个元素,既可以遍历。

三、练习

看看下面的代码表示什么含义?

image.png

第一个表示普通的整型数组

第二个表示存放指针的数组——指针数组

第三个表示数组指针,指向整型数组

第四个比较难。

思考方式:

首先他优先跟【】结合,所以本质是一个数组。

举个简单的例子:int arr[10]。

我们把数组名和【】都去掉,剩下的就是数组的类型

我们也这么思考,把parr[10]去掉,此时剩下int (*)[5],所以就是一个数组指针,也就是这是一个数组,存放数组指针的数组!

该数组能够存放10个数组指针,每个数组指针能够指向一个数组,数组5个元素,每个元素是int类型。

四、一维数组、二维数组的传参

image.png

一维数组传参时如果用数组接收,初始化或者不初始化都可以。

最后一个取的是一级指针的地址,所以要用二级指针接收,正正好。(本身数组名就是首元素的地址)

image.png

总结:

数组传参时,形参一般分两种情况接收

第一种以数组的形式接收,第二种以指针的形式接收(因为数组名也可以看成首元素的地址)

若以数组的形式接收,一维数组初始化与不初始化都可以。

二维数组必须要列初始化。

若以指针的形式接收,二位数组的数组名表示第一行的地址,因此一般就用数组指针接收!

相关文章
|
4月前
使用指针访问数组元素
【10月更文挑战第30天】使用指针访问数组元素。
63 3
|
4月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
4月前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
4月前
|
容器
在使用指针数组进行动态内存分配时,如何避免内存泄漏
在使用指针数组进行动态内存分配时,避免内存泄漏的关键在于确保每个分配的内存块都能被正确释放。具体做法包括:1. 分配后立即检查是否成功;2. 使用完成后及时释放内存;3. 避免重复释放同一内存地址;4. 尽量使用智能指针或容器类管理内存。
|
4月前
|
存储 NoSQL 编译器
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。
|
4月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
85 4
|
4月前
使用指针访问数组元素
【10月更文挑战第31天】使用指针访问数组元素。
65 2
|
4月前
|
算法 索引
单链表题+数组题(快慢指针和左右指针)
单链表题+数组题(快慢指针和左右指针)
53 1
|
5月前
|
存储
如何使用指针数组来实现动态二维数组
指针数组可以用来实现动态二维数组。首先,定义一个指向指针的指针变量,并使用 `malloc` 为它分配内存,然后为每个子数组分配内存。通过这种方式,可以灵活地创建和管理不同大小的二维数组。
|
5月前
|
存储
如何通过指针数组来实现二维数组?
介绍了二维数组和指针数组的概念及其区别,详细讲解了如何使用指针数组模拟二维数组,包括定义与分配内存、访问和赋值元素、以及正确释放内存的步骤,适用于需要动态处理二维数据的场景。