前言:小伙伴们好久不见,因为刚刚开学事情比较多,所以好久没有更新,还请大家见谅。
那么从今天开始,博主承诺每周至少会出1-2篇博客,感谢小伙伴们的支持!
今天这篇文章,我们一起来了解以下指针的扩展——数组指针。
目录
一.什么是数组指针
二.重温数组名的多种用法
三.数组指针的形式
四.数组指针的使用
五.总结
一.什么是数组指针
我们之前已经学习过了指针的基础知识,知道了字符指针,整形指针,那么什么是数组指针呢?
字符指针,是一个指向字符地址的指针;整型指针,是一个指向整型地址的指针。
那么同理,数组指针,就是一个指向数组地址的指针呗。
二.重温数组名的多种用法
我们知道,数组名在大多数情况下代表的是数组首元素的地址,但是也有两个例外:
- sizeof(数组名):数组名代表的是整个数组,计算的是整个数组的大小,单位是字节。
- &数组名:数组名也表示整个数组,取出的是整个数组的地址。
除了这两种特例之外,数组名用在其他地方均代表的是数组首元素的地址。
三.数组指针的形式
int a = 5;
int* p = &a;
char ch = 'b';
char* p = &ch;
这是整型指针和字符型指针的形式。那么数组指针又会是什么形式呢?
Int arr[5] = {1,2,3,4,5};
int (*p) [5] = &arr;
这便是数组指针的形式,*p代表着这是一个指针,[5]则表示这个指针指向的是一个数组,Int则表示指针指向的数组的类型。
有的小伙伴们可能会问,()可以不要吗?
如果不要的话,就变成了int* p[5],这个是不是看着很眼熟?
没错,这是指针数组,是一个存放指针类型元素的数组,因为p会先跟[]结合。
要注意一点就是不管你创建数组时有没有指定数组的大小,但是当你用一个数组指针指向一个数组时,数组的大小就不能省略,因为这样会被编译器认为指针指向了一个未知大小的数组。
那么我们这里出个小问题:
int* arr[5];
如果用数组指针指向这个数组,该怎么表示?
Int* (*p)[5] = &arr;
小伙伴们答对了吗?
我们知道最上边是一个指针数组,那么我们要用一个数组指针去指向一个指针数组,就意味着这个指针要指向的是一个存放指针类型的数组,所以除(*p)外是Int* [5]这样一个指针数组的形式。
四.数组指针的使用
既然数组指针是一种指向数组的指针,那我们就用它来调用数组呗:
#include <stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int(*p)[10] = &arr;
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", (*p)[i]);
}
return 0;
}
比如说我们用数组指针来打印数组的元素,看起来像是很正常的事,但是有没有觉得很别扭?
如果想要打印一个一维数组的元素,是不是直接用普通的指针就可以了?
#include <stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = arr;
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", p[i]);
}
return 0;
}
用普通的指针更方便也更易懂,那么数组指针到底该怎么使用呢?
实际上,数组指针的使用与函数和二维数组关系密切。
如果将一维数组传递给函数,那么函数的形参接收的是数组首元素的地址,用普通的指针便可。
但是我们知道二维数组的数组名代表着数组第一行的地址,是一个数组的地址,这个时候,函数的形参接收的是一个数组的地址,便需要用到数组指针来接收了。
我们实现一个打印二维数组元素的函数:
#include <stdio.h>
void print(int(*p)[5], int r, int c)
{
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 5; j++)
{
printf("%d ", p[i][j]);
}
printf("\n");
}
}
int main()
{
int arr[3][5] = { {1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15} };
print(arr, 3, 5);
return 0;
}
五.总结
以上便是有关数组指针的相关知识啦,这部分知识虽不常用,但也很重要,希望小伙伴们能够耐心掌握!
最后,喜欢博主文章的小伙伴们不要忘记一键三连哦!
我们下期再见!