1.一级指针
一级指针由 指向的数据类型关键词 星号* 指针名字组成
例:int * p =NULL;
指针变量存储的内容是指向的变量的地址
在使用sizeof判断指针的字节数时,在32位机器上为4个字节,在64位机器上也是4个字节
不同类型的指针除了指向的变量数据类型不同外,其解引用的权限也不同,使用位运算符时要注意
数组元素个数也要参与数组类型
void test(int arr[10])// 10是被忽略的
void test(int* arr[5])//不可以,这是一个二级指针
void test(int (*arr)[5])//ok,数组指针
void test(int **arr)//不可以
int main()
{
int arr[3][5] = {0};
test(arr);
}
void test1(int *p) {} //test1函数能接收什么参数?
//整形指针
//一个整形的地址
//整形数组
2.二级指针
二级指针是一个指向指针的指针
int **p;
二级指针传参
#include <stdio.h>
void test(int** ptr)
{
printf("num = %d\n", **ptr);
}
int main()
{
int n = 10;
int*p = &n;
int **pp = &p;
test(pp);
test(&p);
return 0;
}
3.指针数组和数组指针
1)指针数组: int 4* p[10]
由于[]的优先级高于*,所以p先于[4]结合成为数组,数组的元素类型为int*
指针数组是数组, 数组的每个元素都是指针
2)数组指针: int (* p)[4]
由于()的优先级高于[],所以p先和*结合,说明p是一个指针变量,指向一个大小为4的整型数组
指针数组是指针, 能够指向一个数组;
4.函数指针
CPU内部有个PC指针,是CPU内部的寄存器,PC保存的是当前正在执行指令的下一条指令的地址
void (*pfun1)(); //函数指针
void *pfun2();//函数声明
(*(void (*)())0)();// 0地址处所放置的特定函数 0强转成函数指针
void(*p[5])();//函数指针数组
函数名就是函数的地址
int (*fun[5])(int,int)= { 0, add, sub, mul, div };
//函数指针数组, 数组存放函数地址
(*(fun[0]))(x,y) // 调用的两种方法
fun[0](x,y)