C语言 函数和指针

1.指针数组和数组指针
int *p[4]; //定义一个指针数组,该数组中每个元素是一个指针,每个指针指向哪里就需要程序中后续再定义了。
int (*p)[4]; //定义一个数组指针,该指针指向含4个元素的一维数组(数组中每个元素是int型)。

区分int *p[n]; 和int (*p)[n]; 就要看运算符的优先级了。
int p[n]; 中,运算符[ ]优先级高,先与p结合成为一个数组,再由int说明这是一个整型指针数组。
int (*p)[n]; 中( )优先级高,首先说明p是一个指针,指向一个整型的一维数组。
对指针进行加法(减法)运算时,它前进(后退)的步长与它指向的数据类型有关,p 指向的数据类型是int [4],那么p+1就前进 4×4 = 16 个字节,p-1就后退 16 个字节,这正好是数组 a 所包含的每个一维数组的长度。也就是说,p+1会使得指针指向二维数组的下一行,p-1会使得指针指向数组的上一行。

2.指针数组和二维数组指针的区别:
指针数组和二维数组指针在定义时非常相似,只是括号的位置不同:
int *(p1[5]); //指针数组,可以去掉括号直接写作 int *p1[5];
int (*p2)[5]; //二维数组指针,不能去掉括号

3.C函数指针
一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这和数组名非常类似。我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数。这种指针就是函数指针
  函数指针就是一个指针,它指向了一个函数。函数是有地址的,函数指针就可以是那个地址。函数是可以调用的。可以用函数的名字调用函数,也可以用指向这个函数的指针调用这个函数。
  举例:
  int add (int x, int y){return x+y;}
  可以写如下的调用语句: int c = add(1, 2);
  也可以写如下的调用语句:
  int (pf)(int x, int y); /这里pf是函数指针的名字,同时函数指针要求与其指向的函数的参数的个数和类型,还有返回值的类型一致。*/
  pf = add;
  int c = pf(1, 2);
  函数指针的最大作用就是可以动态的调用自己喜欢的函数。
  例如:
  int add (int x, int y){return x+y;}
  int subtract (int x, int y){return x-y;}
  int (*pf)(int x, int y);
  int a = 5; int b=6; int c=0;
  if(b>3) pf = add;
  else pf = subtract;
  int c = pf(a, b);
  调用add还是subtract在程序运行时,依靠b的值决定。

总结:
指针(Pointer)就是内存的地址,C语言允许用一个变量来存放指针,这种变量称为指针变量。指针变量可以存放基本类型数据的地址,也可以存放数组、函数以及其他指针变量的地址。
常见的指针含义:

  • int *p; p 可以指向 int 类型的数据,也可以指向类似 int arr[n] 的数组。
  • int *p; p 为二级指针,指向 int 类型的数据。
  • int p[n]; p 为指针数组。[ ] 的优先级高于 ,所以应该理解为 int *(p[n]);
  • int (*p)[n]; p 为二维数组指针。
  • int p(); p 是一个函数,它的返回值类型为 int
  • int (*p)(); p 是一个函数指针,指向原型为 int func() 的函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值