指针的类型:
指针 : 在学习指针之前,要有一个认知,那就是指针 == 地址;
- 指针的基本使用:
这里要注意三点:1.*标识符—————只产生在指针变量定义或声明的时候;
2.指针的类型要和被赋值的类型一致;
在scanf中,不能使用指针进行;
上面的是最基本的指针定义和使用;
- 指针引用到数组:
和第一个的一样;差别在于把一维数组名来传参,和下面的函数封装一样:
3 . 指针和二维数组 :
二维数组在指针里面,要明白的就只有两点 “是偏移了多少”“怎么表达”
第一个问题:偏移了多少?
在二维数组里面,又可以分成两个一维数组,分别是以数组命名为的一维数组,数组里面的元素又为数组 ; 即父数组
一个是列数组,它的跨度是4个字节; 即子数组;
a + 1 ? 是偏移1个行,就是a[0] 到a[1];
a[0] + 1 ? 是偏移了1个数,就是它旁边的,比喻:a[0][0] 到 a[0][1];
- 函数数组 :
顾名思义,就是把函数名代替成指针;
函数指针:
- 函数指针是指向函数的指针变量。它存储的是函数的地址,可以用来调用函数。
- 函数指针的声明类似于函数声明,只是将函数名替换为指针变量名,并在前面加上 *。
- 函数指针的使用需要先声明一个函数指针变量,然后将函数的地址赋给它,最后通过函数指针来调用函数。
- void (*p)(); // 声明一个函数指针变量p = functionName; // 将函数的地址赋给指针变量p(); // 通过函数指针调用函数
int (*p)(int ,int);
这个是函数指针的书写方式;
4.指针数组
定义一个指针,指向一个数组;
int (*p)[3];
各种指针的定义:
1,一个整型数:int a;
2,一个指向整型数的指针:int *a;
**3,一个指向指针的指针,他指向的指针指向一个整型数:int a;
4,一个有10个整型数的数组:int a[10];
5,一个有10个指针的数组,每个指针指向一个整型数:int *a[10];
6,一个指向有10个整型数的数组的指针:
int (*a)[10];
7,一个指向指针的指针,被指向的指针指向一个有10个整型数的数组:
int (**a)[10];
8,一个指向数组的指针,该数组有10个整形指针:
int *(*a)[10];
9,一个指向函数的指针,该函数有一个整形参数并返回一个整型数:
int (*a)(int);
10,一个有10个指针的数组,每个指针指向一个函数,该函数有一个整形参数并返回一个整型数:
int (*a[10])(int);
11,一个函数的指针,指向的函数的类型是有两个整形参数并且返回一个函数指针的函数,返回的函数指针指向有一个整形参数且返回整型数的函数:
int*((*a)(int int))(int);
这个声明 int(*(*a)(int,int))(int); 是C语言中的一个相对复杂的函数指针声明。要理解它,我们可以逐步拆解它。
首先,我们从里到外、从左到右地分析这个声明。
- 最内层的括号 (*a)(int,int): 这部分表示 a 是一个指向函数的指针,这个函数接受两个 int 类型的参数。
- 中间的 \*: 这个星号表示函数 a 所指向的函数返回的是一个指针。
- 最外层的括号 int(* ... )(int): 这部分描述了上一步中提到的指针所指向的内容。它表示这个指针指向一个函数,这个函数接受一个 int 类型的参数,并返回一个 int 类型的值。
综上,整个声明 int(*(*a)(int,int))(int); 可以理解为:
- a 是一个指针,指向一个函数。
- 这个函数接受两个 int 类型的参数。
- 这个函数返回一个指针,这个指针指向另一个函数。
-
这个被返回的函数接受一个 int 类型的参数,并返回一个 int 类型的值。