C语言基础十——指针(二)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<Windows.h>
#include<string.h>
int fun(int a)
{
return a;
}
int fun1(int a)
{
return fun(a);
}
int fun2(int a,int(*p)(int))
{
return p(a);
}
int main()
{
//指向函数的指针
//在编译时,系统会为函数代码分配一段存储空间,这段地址的起始地址称为函数的指针
//函数指针的定义
//数据类型名 (*函数名)(函数参数类型列表);
int(*p)(int);
p = &fun;//函数指针赋值,&可省;p指向函数fun
printf("%d\n", p(3));
printf("%p\t%p\n", p, fun);//函数名指向函数的首地址
//函数指针的作用
//回调函数,将一个函数的地址作为参数给另一个函数使用,属于间接调用函数用于多线程
printf("%d\n", fun1(2));
printf("%d\n", fun2(2, fun));
//使用typedef给函数指针取别名
typedef int(*funp)(int);//给int(*)(int)类型函数指针取别名 funp
funp p1=fun;//定义函数指针p1并初始化赋值
//int *(*p)(int);//定义指针函数的指针
//指针数组——元素为指针的数组
//指针数组定义——数据类型 *指针数组名[数组元素个数]
int *pun[5];//可存储5个int型指针的数组
//指针数组指向二维数组
//char *p2[4], p3[4][4];
//for (int i = 0; i < 4;i++)
//{
// p2[i] = p3[i];//p2中的每个指针指向p3的每一行
// scanf("%s", p2[i]);//向p2中的指针指向的地址存放字符串——为二维数组p3赋值
//}
//puts(p3[2]);//输出p3[2]
//二维数组指针——指向二维数组的指针(二级指针)
//定义 数据类型(*变量名)[所指向数组大小(列数)]
int aa[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
int(*bb)[4];
bb = aa;//bb指针指向aa的第一行
printf("%d\n", bb[0][0]);//输出a[0][0]
printf("%d\n", *(bb+1)[0]);//输出a[1][0]
printf("%d\n", *(*(bb + 1) + 1));//输出a[1][1]
//指针常量——指向常量的指针
{
const int *p;//p的指向可以改变,不能通过p改变其指向地址存储的数据
int a=10,b=10;
p = &a;
//*p = 30;//此处报错,不可更改值
a = 30;//a的值可修改
//常量指针
int *const p1 = &a;//必须初始化指针指向
//p1 = &b;//此处报错,不可更改指向
*p1 = 100;//值可修改
}
system("pause");
return 0;
}

浙公网安备 33010602011771号