指针、函数、数组

  • 在C语言中,指针是一个很重要但是又很容易弄错的概念,也可以说指针就是C语言的灵魂,所以说学好指针对于完全掌握C语言是一个必须的过程。而在指针中,指针函数、函数指针、指针函数数组、函数指针数组、指向函数指针数组的指针等等概念看着又绕又头疼。本问总结了一下以上一些概念以及用法,并给出例程深化理解。
1. 指针函数

指针函数就是返回指针值的函数,本质是一个函数。所以指针函数等价于“返回值为指针的函数”。

声明形式:type *func (参数列表)

2. 函数指针

函数指针就是一个指向函数的指针。每个函数在编译时,会被分配一个入口地址,一般用函数名来表示,这个地址就是该函数的指针。

声明形式:type (*func)(参数列表 )

从上面的定义形式可以看出,函数指针和指针函数的直观上区别在于指针符号*与函数名/指针名有没有用括号()包裹起来,从这一点来看是很容易区分两者的。

  • 函数指针的两种最普遍的调用形式,一个是直接用定义的指针变量(* func)调用,一个是用指针名调用,后者看起来就像是将原函数使用了新名称去调用一样,可以看成函数的别名。再次强调一下:指针变量名和指针符号 * 一定要用括号包裹起来。函数指针还有一种常用的使用方式,就是使用typedef定义后再使用。
3. 函数指针数组

顾名思义,就是每个元素都是函数指针的数组,直接在函数指针名后面加上数组符号[ ]即可。

声明形式:type (*func[ ])(参数列表 )

4. C语言函数不可以定义为数组,只能通过函数指针来操作定义函数指针数组。
5. 指向函数指针数组的指针

声明形式:type (* (*func )[ ])(参数列表 )

定义形式:void((pfunarr2)[3])()
其中(
pfunarr2)[3]表示数组指针,而void(
)( )表示函数指针,两者结合起来就是指向函数指针数组的指针。

------------------------------------------------------------------------------------

  • @指针
    一个基本的数据类型(包括结构体等自定义类型)加上“ *”号就构成了一个指针类型的模子。这个模子的大小是一定的,与“ *”号前面的数据类型无关。“ *”号前面的数据类型只是说明指针所指向的内存里存储的数据类型。所以,在 32 位系统下,不管什么样的指针类型,其大小都为 4 byt e。

    • int p = NULL——1 和p = NULL——2 有什么区别?
      1中:int *p;p=NULL;地址为null;
      2中:p地址里面的值为null。
      *p的值为“地址0x00000000处的值”(长度由指针类型决定,int为4,double为8)
      int *p = NULL, *p表示0x00000000 ~ 0x00000003之间的值;
      double *p = NULL, *p表示0x00000000 ~ 0x00000007之间的值。
  • @指针数组与数组指针

    • Int *p1[10]:这是一个数组,数组名为p1,其包含10个指向 i n t 类型数据的指针,即指针数组。
      Int (*p2)[10]:这是是一个指针,指针变量名为p2,它指向一个包含10个 in t 类型数据的数组,即数组指针。
  • @指针函数与函数指针

    • A、c har * (* fun 1) ( char * p1 ,char * p2 )
      fun1是指针变量,指向一个函数,函数返回一个char*类型,即函数指针。这里 f u n 1 不是什么函数名,而是一个指针变量,它指向一个函数。这个函数有两个指针类型的参数,函数的返回值也是一个指针。
      • 例子:
char* fun ( char * p1 ,char * p2 )
{
	int i = 0 ;
	i = strcmp (p1,p2) ;
	if (0 == i)
		return p1 ;
	else
	return p2 ;
}
int main ( )
{
	char * (* pf) (char * p1 ,char * p2 );
	pf = &f un;
	(* pf ) ( "aa","bb");
	return 0;
}
  • B、c har * fun 3( char * p1, char * p2) ;
    fun2是函数名,函数返回char*类型,即指针函数

  • @其他

1:unsigned char str[]=“abcd”;
2:unsigned char str[]={‘a’,‘b’,‘c’,‘d’,’\0’};
3:unsigned char str[]={‘a’,‘b’,‘c’,‘d’};
4:unsigned char str[5]=“abcd”;
5:unsigned char str[4]=“abcd”;

    • 1、2、4的效果是等效的,3对应的str的size是4字节,5是一种错误的用法
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值