数组指针的使用

简介: 数组指针的使用

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


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


#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



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


若有不足,请大家指教!


相关文章
|
16天前
使用指针访问数组元素
【10月更文挑战第30天】使用指针访问数组元素。
30 3
|
15天前
使用指针访问数组元素
【10月更文挑战第31天】使用指针访问数组元素。
28 2
|
24天前
|
算法 索引
单链表题+数组题(快慢指针和左右指针)
单链表题+数组题(快慢指针和左右指针)
28 1
|
1月前
|
存储
如何使用指针数组来实现动态二维数组
指针数组可以用来实现动态二维数组。首先,定义一个指向指针的指针变量,并使用 `malloc` 为它分配内存,然后为每个子数组分配内存。通过这种方式,可以灵活地创建和管理不同大小的二维数组。
|
1月前
|
存储
如何通过指针数组来实现二维数组?
介绍了二维数组和指针数组的概念及其区别,详细讲解了如何使用指针数组模拟二维数组,包括定义与分配内存、访问和赋值元素、以及正确释放内存的步骤,适用于需要动态处理二维数据的场景。
|
1月前
|
存储 算法 C语言
C语言:什么是指针数组,它有什么用
指针数组是C语言中一种特殊的数据结构,每个元素都是一个指针。它用于存储多个内存地址,方便对多个变量或数组进行操作,常用于字符串处理、动态内存分配等场景。
|
1月前
魔法指针 之 二级指针 指针数组
魔法指针 之 二级指针 指针数组
19 1
|
1月前
|
存储
一篇文章了解区分指针数组,数组指针,函数指针,链表。
一篇文章了解区分指针数组,数组指针,函数指针,链表。
18 0
|
1月前
|
编译器 C语言
【C语言】指针篇-深入探索数组名和指针数组- 必读指南(2/5)
【C语言】指针篇-深入探索数组名和指针数组- 必读指南(2/5)
|
3月前
|
搜索推荐 C语言
指针与数组
指针与数组
59 9