对指针的认识

1、指针数组

   它是一个数组,数组的元素都是指针,数组占多少字节由数组本身决定,

简称为:存储指针的数组。

  【例】int *P1[10];

   分析:“[]”的优先级比“*”要高,P1先与“[]”结合,构成一个数组的名义,数组名为P1;int * 修饰的是数组的内容,即数组的每个元素。这样可得

知:这是一个数组,这个数组有十个元素,每个元素为int类型的指针,

如图1所示。

 

2、数组指针

   它是一个指针,指向一个数组,在32位系统下永远是占4字节,至于它指向的数组占多少个字节不能而知,简称为:指向数组的指针。

  【例】int (*P2)[10];

   分析:“()”的优先级比“*”要高,P2先与“*”构成一个指针的定义,指针变量名为P2,int修饰的是数组的内容,即数组的每个元素。而数组在这里并没有名字,

是一个匿名数组。这样可得知:这是一个指针,指针名为P2,它指向一个有十个元素的数组,如图2所示。

3、函数指针

3.1 函数指针的含义:

  函数指针就是函数的指针。它是一个指针,指向一个函数。

 

3.2 函数指针的作用

  使用函数指针的好处在于可以将实现同一个功能的多个模块统一起来标识,系统结构

更加清晰,便于后期的维护。即便于分层设、利于系统抽象、降低耦合度以及使接口与

实现分开。

 

3.3 了解函数指针

   1)char *fun(char *P1, char *P2);

   分析:fun是函数名,P1和P2是函数的两个参数,参数类型为char *型,返回值为char * 型。

   2)char * *fun(char *P1, char *P2);

   分析:fun是函数名,P1和P2是函数的两个参数,参数类型为char *型,返回值为char * *型。

   3)char * (*fun)(char *P1, char *P2)

   分析:这是一个指针,P为指针变量,指向一个函数,这个函数有两个char *类型参数,返

回值为char *型。可知:只是一个函数指针

 

3.4 认识函数指针——*(int *)&p

  【例】

# include <stdio.h>

# include <stdlib.h>

 

void Function()

{

printf("Call Function!\n");

}

 

int main()

{

void(*p)();

*(int *)&p = (int)Function;

(*p)();

system("pause");

return 0;

}

运行结果:

分析:

1) void(*p)(),这行代码定义了一个指针变量p,p指向一个函数,函数的参数和返回值都是void型。

2) &p是求指针变量p本身的地址,这是一个32位的整形二进制常数(32位系统)。(int *)&p表示将&p强制转换成整形的指针。

3)(int)Function表示将函数入口的地址强制转换成整形。可知:”*(int *)&p = (int)Function;表示将函数入口的地址赋值给指针变量p。

4)“(*p)()”表示的就是对函数的调用。

注意:函数指针与普通指针没有什么区别,只是指向的内容不同而已。

 

3.5 理解函数指针——(*(void(*)())0)()

第一步:void(*)(),这是一个函数指针,没有函数名,函数的参数和返回值都为void型。

第二步:(void(*)())0,表示将整形0强制转换成函数指针,0是一个地址,即一个函数保存在首地址为0的一段区域内。

第三步:(*(void(*)())0),表示取0地址开始的一段内存里面的内容,其内容就是保存在首地址为0的一段区域内的函数。

第四步:(*(void(*)())0)(),表示函数调用。

 

3.6 函数指针的使用

【例】

# include <stdio.h>

# include <stdlib.h>

# include <string.h>

 

char *fun(char *P1,char *P2)

{

int i = 0;

i = strcmp(P1,P2);

if (0 == i)

{

return P1;

}

else 

{

return P2;

}

}

 

int main()

{

int i = 0;

char * (*Pf)(char *P1,char *P2);

Pf = &fun;//给函数指针赋值

char *ret = (*Pf)("aa","bb");

for (i = 0; i < 8; i++)

{

printf("%c", ret[i]);

}

printf("\n");

system("pause");

return 0;

 

}

运行结果:

注意:给函数赋值时,可以用&fun或直接用函数名fun.因为,函数名被编译后就是一个地址。

 

4、函数指针数组

   函数指针数组,它是一个数组,这个数组存放了指向函数的指针。

   【例】char * (*pf[3])(char *p)

分析:它是一个数组,数组名为Pf,数组内存储了3个指向函数的指针。这些指针指向参数

为char类型的指针,返回值为指向char类型的指针。

# include<stdio.h>

# include <stdlib.h>

 

char *fun1(char *p)

{

printf("%s\n",p);

return p;

}

 

char *fun2(char *p)

{

printf("%s\n",p);

return p;

}

 

char *fun3(char *p)

{

printf("%s\n",p);

return p;

}

 

int main()

{

char * (*pf[3])(char *p);

pf[0] = fun1;//可以直接用函数名

pf[1] = &fun2;//也可以用函数名加上取地址符

pf[2] = &fun3;

 

pf[0]("fun1");

pf[1]("fun2");

pf[2]("fun3");

system("pause");

return 0;

}

运行结果为:

 

5、函数指针数组指针

   函数指针数组指针,它是一个指针,这个指针指向一个数组,这个数组存放的都是指向函数的指针。

   【例】char * (*(* pf)[3])(char *p)

分析:pf是指针变量,指向一个包含3个元素的数组,这个数组存放了一个指向函数的指针。这些指针指向返回值为char类型的指针,参数为指向一个char类型的指针。

# include <stdio.h>

# include <stdlib.h>

 

char *fun1(char *p)

{

printf("%s\n",p);

return p;

}

 

char *fun2(char *p)

{

printf("%s\n",p);

return p;

}

 

char *fun3(char *p)

{

printf("%s\n",p);

return p;

}

 

int main()

{

char * (*a[3])(char *p);

char * (*(*pf)[3])(char *p);

pf = &a;

a[0] = fun1;//可以直接用函数名

a[1] = &fun2;//也可以用函数名加上取地址符

a[2] = &fun3;

 

pf[0][0]("fun1");

pf[0][1]("fun2");

pf[0][2]("fun3");

system("pause");

return 0;

}

运行结果为:

 

 

   

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值