上一篇博客笔者介绍了数组指针,但是数组指针的使用,对于不少读者或多或少的有着些许疑惑!下面笔者将带领大家走进数组指针的使用!!
下面请看笔者将用代码+解析的过程来带领大家分析!
#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"); }
上面的代码运行结果也是一样的!运行结果为:
下面来讲解一下:数组指针在一维数组中的使用!(啰嗦麻烦)
#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] 下标,来打印整个数组!
打印的结果也是一样的!
但是对于上述案列,大家也可以看出来,虽然成功的用了数组指针,但是有着明显的啰嗦麻烦!所以很少使用过!因为数组指针一般在二维数组的使用较为广泛!
下面来讲解一下:数组指针在一维数组中的使用!
#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);
数组名是数组首元素的地址!
即:
对于二维数组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)::解引用得到数值!
上述就是笔者对于数组指针的了解与认识!
若有不足,请大家指教!