数组指针的使用

简介: 数组指针的使用

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


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


#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



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


若有不足,请大家指教!


相关文章
|
2月前
|
搜索推荐 C语言
指针与数组
指针与数组
51 9
|
2月前
|
算法 Java
双指针在数组遍历中的应用
文章深入探讨了双指针技术在数组遍历中的应用,通过实战例子详细解释了快慢指针和首尾指针的不同用法,并提供了解决LeetCode相关问题的Java代码实现。
|
2月前
|
存储 程序员 C语言
指针的高级应用:指针数组、数组指针、函数指针等。
指针的高级应用:指针数组、数组指针、函数指针等。
81 0
|
3月前
|
运维
开发与运维数组问题之指针的加减法意义如何解决
开发与运维数组问题之指针的加减法意义如何解决
38 7
|
3月前
|
C++ 索引 运维
开发与运维数组问题之在C++中数组名和指针是等价如何解决
开发与运维数组问题之在C++中数组名和指针是等价如何解决
22 6
|
3月前
|
存储 C++ 运维
开发与运维数组问题之指针的定义语法如何解决
开发与运维数组问题之指针的定义语法如何解决
27 6
|
4月前
|
编译器 C语言
指针进阶(数组指针 )(C语言)
指针进阶(数组指针 )(C语言)
|
4月前
|
C语言
【C语言】:详解函数指针变量,函数指针数组及转移表
【C语言】:详解函数指针变量,函数指针数组及转移表
50 2
|
4月前
|
C语言
【C语言】:详解指针数组,数组指针及(二维)数组传参(2)
【C语言】:详解指针数组,数组指针及(二维)数组传参(2)
31 1
|
4月前
|
Serverless C语言
【C语言】:对(一维)数组与指针的深入理解(1)
【C语言】:对(一维)数组与指针的深入理解(1)
30 1