指针数组 数组指针 指针函数 函数指针绕口令

来源:互联网 发布:淘宝1元贱卖腾讯会员 编辑:程序博客网 时间:2024/06/05 18:42

1.数组的四种访问方式
定义数组 a[]; 指针 *p 指向数组a;
(1) 利用数组的下表进行访问 a[i];
(2) 数组名+地址的偏移量i , *(a+i)
(3) 利用指针 p 进行下表访问 p[i]
(4) 指针p + 地址的偏移量i ,*(p+i)
一维数组数组名:相当于一个指针常量
2.
数组指针(指针) 指针数组(数组)
函数指针(指针) 指针函数(函数) ——–>只看后边两个字就能够区分是指针还是数组或函数
数组指针:(指向数组全部地址的指针)

int a[3]={2,3,4}int *p = a;                     // 指向数组的指针int *p1 = &a[0]                  // 指向数组首元素的指针int (*p2)[3] = &a;                // 数组指针指向数组的全部地址,p2是一个二维指针,指向含有三个元素的数组
   3  - >   所指向数组中数据的个数 &a  表示数组从开始到结束全部的地址空间

指针数组:(保存多个地址的数组)

int a=10;int b=20;int c=30;int *pa[3]={&a,&b,&c};           //保存的是 int* (地址)

函数指针 (指向函数的指针) // 函数名代表函数的入口地址

三个要素: 与所指函数 返回值类型相同,参数类型相同,参数个数相同。

int Max(int a,int b){ }int (*pfun)(int,int);main(){   Max(12,13);   pfun=&Max;          ---->         pfun=Max;   pfun(12,13);     ---->         pfun(12,13);}

指针函数 (返回类型为指针类型变量的称为指针函数)
定义格式: 返回类型标识符 *函数名称(形式参数表)
{ 函数体 }

3 如何区分:
数组指针:
定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,
这个一维数组的长度是n。
指针数组:
定义 int *p[n]; []优先级高,先与p结合成为一个数组,再由int*说明这是一个整型
指针数组,它有n个指针类型的 数组元素。
函数指针:
定义 int (*pfun)(int,int); *pfun在括号内,首先形成指针,出括号后仍为括号,
指向一个返回值为整形的函数,并且此函数有 两个整形作为形参。
指针函数:
定义 int *fun();相当于int* fun(); 返回值为一个整形的指针。

4.复杂指针:

右左法则: 从未定义的标识符开始阅读,然后先往右看,再往左看。每次遇到圆括号时,掉转方向。               一旦解析完圆括号里面所有的东西,就跳出圆括号。重复这个过程直到解析完毕。
int (*fun)(int *p); fun为函数指针。

首先找到那个未定义的标识符,就是fun,它的外面有一对圆括号,而且左边是一个*号,这说明
fun是一个指针,然后跳出这个圆括号,先看右边,也是一个圆括号,这说明(*func)是一个函数,
而fun是一个指向这类函数的指针,就是一个函数指针,这类函数具有int*类型的形参,返回值类型是 int。

int (*Comp(int a,int b))(int, int);定义一个返回函数指针的指针函数

首先找到那个未定义的标识符,就是Comp,它的外面有一对圆括号,而且左边是一个*号,右边是(int a,int b);这说明Comp(int a,int b)是一个函数,含有两个参数 a,b; 然后跳出这个圆括号,先看右边,也是一个圆括号, 左边是int ,上面可以看做两步的结合。

Comp(int a,int b)int (*fun)(int , int )//很明显这个是函数指针形式;对比下int (*Comp(int a,int b))(int, int)//可以知道Comp(int a,int b)函数是返回int (*fun)(int , int )形式的函数指针的

函数指针数组

int (*fun[5])(int *p) ;fun是一个数组,数组元素数据类型为函数指针

fun右边是一个[ ],说明fun是一个具有5个元素的数组,fun的左边有一个*,说明fun的元素是指针,要注意这里的*不是修饰 fun的,而是修饰fun[5]的,原因是[]运算符优先级比*高,fun先跟[]结合,因此修饰的是func[5]。跳出这个括号,看右边,也是一对圆括号,说明func数组的元素是函数类型的指针,它所指向的函数具有int类型的形参,返回值类型为int。

实例代码:

#include <stdio.h>#include <stdlib.h>#include <stdio.h>#include <stdlib.h>int Max(int a,int b);int * Com();int (*Comp(int,int))(int,int);int main(){    //数组指针,指向数组的指针;    //指针数组,数组元素为指针变量的数组;    int arrayA[3]={13,12,14};    int *p=arrayA;//指针变量    int (*p2)[3]=&arrayA;//数组指针    printf("*p == %d\n",*p);    printf("**p2 ==%d",**p2);    printf("\n----------------------------\n");    int i=0;    for(i=0;i<3;i++)        printf("**(p+%d) == %d\t",i,*(*p2+i));    printf("\n----------------------------\n");    //指针数组,数组元素为指针变量得数组;    int a=10;    int b=20;    int c=30;    int *pa[3]={&a,&b,&c};           //保存的是 int* (地址)    for(i=0;i<3;i++)        printf("*(pa+%d) == %d\t",i, *(*(pa+i)) );   printf("\n----------------------------\n");   //函数指针,指向函数的指针变量   int (*pfun)(int,int);//定义函数指针变量   pfun=Max;//函数名赋值给函数指针   printf("Max is(6,5)is %d\n",Max(6,5));   printf("pfun is(6,5)is %d\n",pfun(6,5));   printf("\n----------------------------\n");   //指针函数,即函数返回值为一个指针变量   //定义一个返回一个int型指针变量函数,Com   printf("函数执行返回一个整形指针变量并取值   %d\n",*Com());   //返回一个函数指针变量,这个函数指针变量有两个int形参,返回值为int   ////调用函数Comp,通过Comp返回的指针用100调用函数Max   printf("函数返回一个函数指针变量,并调用这个函数指针变量 ==%d",Comp(12,15)(5,6));   printf("\n----------------------------\n");    return 0;}/**返回类型为函数指针类型指针变量;也就是返回一个函数地址定义一个返回函数指针变量的函数Comp,这个函数有两个形参 a,b;函数返回值类型为一个具有两个int类型参数,返回值为int的函数指针变量。*/int (*Comp(int a,int b))(int, int){    printf("a+b =%d",a+b);    return Max;}/**返回类型为普通数据类型的指针变量    指针函数实例*/int * Com(){    int i=10;    int *p=&i;    return p;}int Max(int a,int b){    if(a>=b)        return a;    else        return b;}

输出结果:
这里写图片描述

0 0
原创粉丝点击