5--指针与数组(下)

一:定义数组类型(数组元素类型+数组大小)

typedef  type(name)[size]

例如:typedef    int(AINT5)[5];

   typedef     float(AFLOAT10)[10];

           AINT5      iarry;

   AFLOAT10   ifloat;

二:数组指针和指针数组

数组指针:是一个指针,指向一个数组

指针数组:是一个数组,数组元素为指针

数组指针定义:arraytype *point或者type (*point)[n]

typedef float(AFLOAT10)[10];   //定义一个数组类型

float fArray[10];        //定义一个数组

AFLOAT10* pf = &fArray;   //定义一个数组指针 

for(i=0; i<10; i++){        //数组元素赋值

(*pf)[i] = i;

}

for(i=0; i<10; i++){   //数组元素打印

printf("%f\n", (*pf)[i]);

}

指针数组的定义:type* pArray[n];

type *为数组中每个元素的类型

pArray为数组名,n为数组大小

例如:   

 const char* keyword[] = {
            "do",
            "for",
            "if",
            "register",
            "return",
            "switch",
            "while",
            "case",
            "static"
  };

printf("%s\n",keyword[1]);

打印结果:for

附:const int ar[5];

    printf("%d\n",sizeof(ar));  \\数组所占空间的大小
    printf("%d\n",sizeof(*ar)); \\数组元素所占空间的大小

    #define DIM(a) (sizeof(a)/sizeof(*a))  \\一个数组中有多少元素

三:指向指针的指针?????

指针变量在内存中会占用一定的空间

可以定义指针来保存指针变量的地址值

为什么需要指向指针的指针

指针在本质上也是变量

对于指针也同样存在传值调用和传址调用

    int a=0;
    int *p=NULL;
    int **pp=NULL;
    pp=&p;  
    *pp=&a;    //22fe38=p=&a=22fe44
    
    printf("%0X\n", &a);
    printf("%0X\n", p);
    printf("%0X\n", *p);
    printf("%0X\n", pp);  // 
    printf("%0X\n", *pp);   //变量a的地址值 
    printf("%0X\n", **pp);  //打印变量a=0 

结果

分析:

四:二维数组和二级指针

二维数组在内存中以一维的方式排布

二维数组的第一维是一维数组

二维数组的第二维才是具体的值

二维数组的数组名可看做常量指针



数组名

一维数组数组名代表数组首元素的地址

二维数组名代表二维数组的首元素的地址,二维数组的元素是一个一位数组



五:数组参数和指针参数

C语言中只会以值拷贝的方式传递参数

当向函数传递数组时,将数组名看做常量指针传数组首元素的地址

因为C语言以高效为最初设计目的,在函数传递整个数组,如发生数组拷贝,执行效率大大下降


六:函数类型

C语言的函数有自己的特定类型

函数类型由返回值,参数类型和参数个数共同决定

通过typedef为函数类型重命名

typedef type name(parameter list)

例:typedef int f(int,int);????怎么使用


七:函数指针

函数指针用于指向一个函数

函数名是执行函数体的入口地址

可通过函数类型定义函数指针  FUNCTYPE * pointer

也可以直接定义  type (*point)(parameter list);

typedef int(FUNC)(int);  //定义一个函数类型

int test(int i){}  //一个函数

FUNC* pt = test;  //定义一个函数指针,并初始化

pt(2)  //使用函数

或者(*pt)(2)    //使用函数结果和上相同


八:回调函数

个人认为:利用函数指针作为函数参数实现的一种调用机制

回调函数机制原理:

调用者不知道具体事件发生的时候需要调用哪一个的具体函数

被调函数也不知道何时被调用,只知道被调用后需要完成某些任务

当具体事件发生时,调用者通过函数指针调用具体的函数

回调机制将调用者和被调用者分开,两者互不依赖

例如:

typedef int(*FUNCTION)(int);  //定义函数类型

int g(int n, FUNCTION f){}      //调用机制

int f1(int x){}   //函数体一,执行具体的任务

int f2(int x){}  

int f3(int x){}

int main()
{
    printf("x * f1(x): %d\n", g(3, f1));
    printf("x * f2(x): %d\n", g(3, f2));
    printf("x * f3(x): %d\n", g(3, f3));
}













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值