👑个人主页:啊Q闻
🎇收录专栏:《C语言》
🎉道阻且长,行则将至
前言
这篇博客分享的指针部分为与数组有关的指针知识,包括一位数组和二维数组
指针详解1的博客 【C语言】指针详解1-CSDN博客如果需要,可以去瞅瞅
一.数组名的理解
数组名就是首元素的地址,但是有两个例外:
sizeof(数组名)sizeof中单独放数组名的时候,这个数组名表示整个数组,计算的是整个数组的大小,单位是字节。
&数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
当首元素地址加一时(arr[0],arr),其跳过的为数组一个元素的地址。
当&arr加一时,其跳过的为整个数组 。
二.使用指针访问数组
&arr[i]相当于&p[i]相当于&*(p+i)相当于p+i
arr[i]相当于p[i]相当于*(p+i)
三. 指针数组与数组指针
1.指针数组
1.初识指针数组
指针数组是存放指针的数组。
例如:int*p[10]
解释:因为p和[]先结合,说明该为一个数组,然后数组中存放的是地址。
2.指针数组模拟实现二维数组
指针数组可以模拟出二维数组,但它并不是完全的二维数组,因为二维数组在内存中的存储是连续的,而模拟的二维数组不是。
#include<stdio.h>
int main()
{int arr1[] = { 1,2,3,4,5 };int arr2[] = { 1,1,1,1,1 };int arr3[] = { 2,2,2,2,2 };int* parr[3] = { arr1,arr2,arr3 };//指针数组int i = 0;int j = 0;for (i = 0; i< 3; i++){for (j = 0; j < 5; j++){printf("% d", parr[i][j]);}printf("\n");}return 0;
}
2.数组指针
数组指针即存放的是数组的地址,能够指向数组的指针变量
例如:int(*p)[10]
解释:因为p和*先结合,说明该为一个指针,然后指向的是大小为10个整型的数组。
四.数组的本质
我们学习的数组可以分为一维数组和二维数组,我们分别讲述它的本质。
1.一维数组传参本质
一维数组传参本质上传递的是数组首元素的地址。
如下:
详解:1.因为传参时,传递的为数组首元素的地址,即为指针的大小(我的环境为64位),8/4=2.数组传参无法传过去整个数组,只能传首元素的地址,然后通过首元素顺藤摸瓜找到数组的所有元素。
2.我们计算数组的大小时,不要在调用函数中计算
2.二维数组传参本质
二维数组传参本质是传递第一行这个一维数组的地址
如下:
对于二维数组,arr[i][j]相当于(*(*(p+i)+j)
五.函数指针变量
1.初识函数指针
函数指针变量是用于存放函数地址的,未来能够通过地址调用函数
函数是存在地址的·,并且函数名就是函数地址
2.函数指针变量使用
其中int (*pf) (int x,int y) 为函数指针
六.函数指针数组
把函数的地址放在一个数组中,那这个数组就叫做函数指针数组
函数指针数组再转移表中也有用到,利用函数指针数组,减少了相同代码的重复出现
谢谢大家阅读,如果对你有帮助的话,给个三连吧😘