C语言指针(进阶)

1.指针语法解剖

·任意的指针,不管有多复杂,其定义都由两部分组成。。第1部分:指针所指向的数据类型,可以是任意的类型
。第2部分:指针的名字

· 示例
char(*p1);                  //第2部分:*p1;第1部分:char;
char*(*p2);                //第2部分:*p2;第1部分:char*;
char**(*p3);              //第2部分:*p3;第1部分:char**;
char(*p4)[3];            //第2部分:*p4;第1部分:char[3];
char(*p5)(int,char);  //第2部分:*p5;第1部分:char(int,float);

·注解:
1.上述示例中,p1、p2、p3、p4、p5本质上并无区别,它们均是指针

2.上述示例中,p1、p2、p3、p4、p5唯一的不同,是它们所指向的数据类型不同
3.第1部分的声明语句,如果由多个单词组成,C语言规定需要将其拆散写到第2部分的两边

2.特殊指针

2.1 char型指针

char型指针实质上跟别的类型的指针并无本质区别,但由于C语言中的字符串以字符数组的方式存储,而数组在大多数场合又会表现为指针,因此字符串在绝大多数场合就表现为char型指针。

·定义
char *p="abcd";

2.2多级指针

···如果一个指针变量p1存储的地址,是另一个普通变量a的地址,那么称p1为一级指针
···如果一个指针变量p2存储的地址,是指针变量p1的地址,那么称p2为二级指针

···如果一个指针变量p3存储的地址,是指针变量p2的地址,那么称p3为三级指针
···以此类推,p2、p3等指针被称为多级指针

·示例:
int a=100;
int*p1=&a;      //-级指针,指向普通变量
int**p2=&p1;   //二级指针,指向一级指针
int***p3=&p2; //三级指针,指向二级指针

2.3 void型指针

·概念:无法明确指针所指向的数据类型时,可以将指针定义为void 型指针
·要点:


void 型指针无法直接索引目标,必须将其转换为一种具体类型的指针方可索引目标b.void 型指针无法进行加减法运算


·void关键字的三个作用:


a.修饰指针,表示指针指向一个类型未知的数据。
b.修饰函数参数列表,表示函数不接收任何参数。(预习)int main(void)

c.修饰函数返回类型,表示函数不返回任何数据。(预习)void func(int)

·示例:
//指针p指向一块4字节的内存,且这4字节数据类型未确定
void*p=malloc(4);

//将这4字节内存用来存储int型数据
*(int*)p=100;
printf("%d\n",*(int*)p);

//2,将这4字节内存用来存储float 型数据
*(float*)p=3.14;
printf("%f\n",*(float*)p);

2.4 const型指针

·const型指针有两种形式:①常指针②常目标指针

.常指针:const修饰指针本身,表示指针变量本身无法修改。

常目标指针:const修饰指针的目标,表示无法通过该指针修改其目标。

·常指针在实际应用中不常见。
·常目标指针在实际应用中广泛可见,用来限制指针的读写权限

·示例:
int a=100;
int b=200;

//第1中形式,const修饰p1本身,导致p1本身无法修改
int*const p1=&a;

//第2中形式,const修饰p2的目标,导致无法通过p2修改a
 int const*p2=&a;
 const int*p2=&a;

2.5函数指针

·概念:指向函数的指针,称为函数指针。
·特点:函数指针跟普通指针本质上并无区别,只是在取址和索引时,取址符

void f(int);       //函数f的类型是:void(int)
void(*p)(int);  //指针p专门用于指向类型为void(int)的函数
p=&f;             //p指向f(取址符&可以省略)p=f;//p指向f

//以下三个式子是等价的:
f(666);       //直接调用函数f
(*p)(666); //通过索引指针p的目标,间接调用函数f
 p(666);   //函数指针在索引其目标时,星号可以省略

要点:
a.函数指针是一类专门用来指向某种类型函数的指针。
b.函数的类型不同,所需要的函数指针也不同。
c.函数的类型,与普通变量的类型判定一致,即去除声明语句中的标识符之后所剩的语句。

3.指针的各种++的区别

int a=10,*p=&a;
*p++       -->++作用与指针p,内存地址加一个存储单位,先执行*p,再执行p++
(*p)++    -->++作用于*p指向空间内的值,先执行*p,再执行a=a+1
++*p       -->++(*p)-->++作用于*p指向空间内的值,o*p,②+1
*++p       -->++作用与指针p

练习

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值