数组指针的使用

简介: 数组指针的使用

上一篇博客笔者介绍了数组指针,但是数组指针的使用,对于不少读者或多或少的有着些许疑惑!下面笔者将带领大家走进数组指针的使用!!


下面请看笔者将用代码+解析的过程来带领大家分析!


#include <stdio.h>
void print1(int arr[], int sz)
{
  int i = 0;
  for (i = 0; i < sz; i++)
  {
  printf("%d ", arr[i]);
  }
  printf("\n");
}
int main()
{
  int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  print1(arr, sz);
  return 0;
}


上述代码是刚刚学习函数时候就具备的知识,在此,笔者就不做过多的讲述!但是对于sz的值为什么在main函数里面来求,而不是在print1函数里面求,大家应该也能知道!但是,笔者在此,仍忍不住想提醒一下!对于数组传参,传过去的是首元素的地址,如果sz在print1里面来求,则计算的是地址的大小,4个字节,而不是数组元素的大小!所以sz要在main函数里面来求,并且作为实参传过去!


下面是对print1的函数进行更改!请看代码:


void print1(int* arr, int sz)
{
  int i = 0;
  for (i = 0; i < sz; i++)
  {
  printf("%d ", *(arr + i));
  }
  printf("\n");
}

上面的代码运行结果也是一样的!运行结果为:


0a2653c851af460fa595bd959398a8f1.png


下面来讲解一下:数组指针在一维数组中的使用!(啰嗦麻烦)


#include <stdio.h>
void print2(int(*p)[10], int sz)
{
  int i = 0;
  for (i = 0; i < sz; i++)
  {
  printf("%d ", (*p)[i]);
  }
  printf("\n");
}
int main()
{
  int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  print2(&arr, sz);
  return 0;
}


在上述代码段中,数组传参,传过去的就是:     print2(&arr, sz);    对于形参的内容,请大家认真分析!   &arr  取出的是整个数组的地址!然后作为实参传递给形参:int(*p)[10]!该形参的类型为:int(*)[10]  类型!


在这面: int(*p)[10]  ,将地址交给了p, p就相当于:&arr,  *p相当于*&arr--->arr!


对于:(*p)[i]中:*p是对p进行解引用:得到整个数组,在通过 [i] 下标,来打印整个数组!


打印的结果也是一样的!


6de278e6d6694ce5bb08e7e842b7e74b.png


但是对于上述案列,大家也可以看出来,虽然成功的用了数组指针,但是有着明显的啰嗦麻烦!所以很少使用过!因为数组指针一般在二维数组的使用较为广泛!


下面来讲解一下:数组指针在一维数组中的使用!


#include <stdio.h>
void print3(int arr[3][5], int r, int c)
{
  int i = 0;
  for (i = 0; i < r; i++)
  {
  int j = 0;
  for (j = 0; j < c; j++)
  {
    printf("%d ", arr[i][j]);
  }
  printf("\n");
  }
}
void test2()
{
  int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
  print3(arr, 3, 5);
}
int main()
{
  test2();
  return 0;
}


在上述代码中,笔者用了:数组传参,数组接收这个方法来书写代码!这个也是最常规的写法!


但是,我们需要注意的是: print3(arr, 3, 5);部分,二维数组的数组名也是首元素的地址,因此也可以用指针来接收!即:数组传参,指针接收!


但是对于二维数组的首元素,大家目前还是都存有疑惑,不知道该如何去思考!!


下面,笔者来大家来带领对二维数组的首元素进行分析!


arr是数组名,数组名就是数组首元素的地址!因此:arr就是第一行的地址!(可以当作一维数组来使用)


对于  :    


int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
print3(arr, 3, 5);

数组名是数组首元素的地址!


即:


12c3b7f3f8814309a195c64f051d4445.png


对于二维数组arr[3][5],3行5列,将每一行看作一个元素,则arr[3][5]:有3个元素,每个元素都是含有5个整型的一位数组!


!因此对于二维数组的首元素!转化为一维数组才有首元素!


对于一维数组的地址,就应该放到数组指针里面!


{
   int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
   print4(arr, 3, 5);
}

对于上述arr,传参传的是二维数组的数组名,传过去之后,变成(首元素的地址)第一行元素的地址!


void print(int(*p)[5], int r, int c)
{
}

对于上述代码,int(*p)[5]:指向一维数组的数组指针!


下面请看笔者用指针来写的代码:


#include <stdio.h>
void print4(int(*p)[5], int r, int c)
{
  int i = 0;
  for (i = 0; i < r; i++)
  {
  int j = 0;
  for (j = 0; j < c; j++)
  {
    printf("%d ", *(*(p + i) + j));
  }
  printf("\n");
  }
}
void test2()
{
  int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
  print4(arr, 3, 5);
}
int main()
{
  test2();
  return 0;
}

对于上述:*(*(p + i) + j)  表示:第i行里面的 j元素的值!下面对其进行分组解析!


p+i :;相当于第 i 行的地址!


*(p+i):;相当于拿到第 j 行!


*(p+i)+j ::依次往后走!


*(*(p+i)+j)::解引用得到数值!


34e8d716411043c08c7ffba9fbba23de.png



上述就是笔者对于数组指针的了解与认识!


若有不足,请大家指教!


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

热门文章

最新文章