前言:
学习C语言,不可跳过的一个难点就是对于指针的学习,相信大家也对指针具体是个啥玩意感到困惑过(博主以前学习指针的时候也是一直弄不懂,对它真的就 是深恶痛绝),下边我们来聊一下和为指针:指针顾名思义,就是指向某一个东西,在内存当中,内存是被分成一块一块的区域,每一块区域有一个唯一标识的编号,拿32位操作系统举例,就是在内存中划分32块区域,每块区域都有着它相对应的编号,而我们正常情况当中要如何去使用这块区域呢,这个时候就得用到指针了,声明一个指针变量指向这块区域,就相当于每个酒店里边的房间都有它相对应的房间号,同理,在内存中,指针则表示该区域的编号,所以又可以说指针里边就是地址,它是指向一个地址的
指针的分类:
C语言中有着许多不同类型的数据,如(int,char,double,float等),此时也需要有着不同类型的指针来对应指向不同类型的数据,指针又分为:
1. 一级指针(字符指针,整形指针等)
2. 二级指针(存放一级指针的地址)
3. 指针数组(存放指针的数组)
4. 数组指针(指向数组的指针)
5. 函数指针数组(存放函数指针的数组)
一级指针:
一级指针包括很多,比如整形指针,字符指针,浮点型指针等,这里拿整形指针举例给大家了解一下:
int main()
{
int a = 20; //a的类型为int
int* p = &a; //此时指针p的类型对应则为int* 其余类型同理
printf("%d\n", *p);
}
二级指针:
二级指针是用来存放一级指针的地址的,此处借用上边例子给大家理解一下:
int main()
{
int a = 20;
int* p = &a;
int** p1 = &p; //取出指针p的地址,存放在二级指针p1中 int**是二级指针
printf("%d\n", *p);
printf("%p", *p1); //%p以十六进制输出地址
}
指针数组:
指针数组存放指针的数组,顾名思义,就是数组当中的元素为指针,举例:
int main()
{
int a = 20;
int b = 10;
int* p = &a;
int* p1 = &b;
int* arr[] = { p,p1 }; //指针数组,里边的每一个元素类型为int*
for (int i = 0; i < 2; i++) //指针数组的输出
{
printf("%d ", *(arr[i]));
}
}
数组指针:
数组指针是指向一个数组的指针,如一个数组int arr[4]={0},则指向该数组的指针为,首先我们要思考两个问题,我们该用什么样的数据类型来接收这个数组呢,答案是用该数组的类型来接收,arr的类型为int[4],所以指针p可以写成 int (*p)[4]=&arr,举例:
int main()
{
int arr[4] = { 1,2,3,4 };
int(*p)[4] = &arr;
}
此处调试可以发现指针p的类型和我们上边所讲的一样
函数指针数组:
数组是指存放一系列相同类型的元素,而函数指针数组则是将函数的地址存放在数组当中
那么函数数组又是如何定义的呢,还是和上边一样,先确定函数的类型,然后定义,举个例子:
int Sum(int n, int m)
{
return n + m;
}
int Mul(int n, int m)
{
return n - m;
}
int main()
{
int a = 20;
int b = 10;
//函数的类型是:int xxx(int, int)
//则定义一个大小为2的函数指针数组
int (*pf[2])(int, int) = { Sum,Mul };
}
(今日分享到此结束,感谢支持Thanks♪(・ω・)ノ!!!)