c语言中指针详解

指针概念 :

  1. 指针就是个用来存放地址的变量,地址唯一标识一块内存空间
  2. 指针的大小是固定的4/8个字节(32位/64位)。
  3. 指针是有类型的,指针的类型决定了指针的+ -整数的步长,指针解引用操作的权限。整型指针解引用访问4个字节,字符指针解引用访问1个字节

 

字符指针(char*)

 char *p ="abcdef" //“abcdef”是一个常量字符串(不能被改变),p中存储的是a的地址(首字符的地址)

指针数组  (是数组,用来存放指针的)

 int main()

{

 int arr[10]={0};  //整形数组

 char ch[5]={0}; //字符数组

 int *parr[4];  //存放整形指针的数组--指针数组

 char *pch[5];  //存放字符指针的数组--指针数组

 return 0;

}

  arr----指首元素的地址

 &arr----指数组的地址

 

 

数组指针  (是指针,用来存放数组地址的)

 int *p=NULL;  //p是整形指针--指向整形的指针,可以存放整形的地址

 char *p=NULL;  //p是字符指针--指向字符的指针,可以存放字符的地址

 int arr[10]={1,2,3,4,5,6,7,8,9,10};

int (*p)[10]=&arr;  //p是数组指针--指向数组的指针,可以存放数组的地址

区分 :

 int *p1[10];  //存放指针的数组

  

 int (*p2)[10];  //存放数组的指针

 p1先和[10]结合,一定是个数组;

  p2先和 * 结合,一定是个指针;

 

 int arr[5];  //arr是一个5个元素的整形数组

 int *parr1[10];  //parr1是一个10个元素的数组,        每个元素的类型是int*parr1是指针数组

 int (*parr2)[10];  //parr2是一个指针,该指针指向了一个有10个元素的数组,每个元素的类型是intparr2是数组指针

 int (*parr3[10])[5];  //parr3是一个数组,该数组有10个元素,每个元素是一个数组指针,该数组指针指向的数组有5个元素,每个元素的类型是int

 

 

 

数组参数、指针参数

一维数组传参

 

二维数组传参

 

二维数组传参,函数形参设计时,只能省略第一个[]的数字。

一级指针传参

 

一级指针传参,接收时也要用一级指针来接收

函数的参数部分为一级指针的时候,函数能接收变量的地址,或存放地址的一级指针变量

二级指针传参

二级指针传参,接收时也要用二级指针来接收

函数的参数部分为二级指针的时候,函数能接收一级指针变量的地址二级指针变量,和存放一级指针的数组的数组名

函数指针 (是指向函数的指针)

&函数名  和  函数名  都是函数的地址

 

 int (*pa)(int x,int y) = Add;

//代码1

 (*(void)())0)();  

 //把0强制类型转换成 :void(*)() 函数指针类型--0就是一个函数地址

 //调用0地址处的该函数

总结 :是一次函数调用  参数为无参,返回类型为void

 

 //代码2

 void (*signal(int ,void(*)(int)))(int);

//signal是一个函数声明,sianal函数参数有两个,一个是int,另一个是函数指针,该函数指针指向的函数的参数是int,返回类型是void。

//signal函数的返回类型也是一个函数指针,该函数指针指向的函数的参数是int,返回类型是void。

函数指针数组(存放函数指针的数组)

把函数的地址存放到一个数组中,那这个数组就叫函数指针数组

 int(*parr[4])(int,int)={Add,Sub,Mul,Div};  //函数指针数组

函数指针类型

   parr先和[4]结合,说明是数组,数组的内容是  int (*)()  类型的函数指针   

指向函数指针数组的指针  (是指针,该指针指向一个数组,数组的元素都是函数指针)

回调函数

回调函数是一个通过函数指针调用的函数,如果把函数的地址作为参数传递给另一个函数,当这个指针被用来调用其所指的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另一方调用的,用于对该事件或条件进行响应。

      

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值