zoukankan      html  css  js  c++  java
  • C语言中的复合类型

    复合类型

    一、掌握的类型

    1. 指针数组

    int * arr[10]; //arr是一个数组,有10个元素,每个元素都是一个指针,即arr是一个指针数组

    int a,b,c,d;

    arr[0] = &a;

    arr[1] = &b;

    arr[2] = &c;

    arr[3] = &d;

    *arr[0] = 123; // a = 8;

    2. 指向数组的指针

    int (*p) [10];  //p是一个指针变量,指向一个有10个整形元素的数组

    int arr[10] = {12,32,34,43,45};  

        int (*p) [10] = &arr;

    p = arr; //会弹出类型不匹配的警告信息,因为,数组名就是数组的首地址,&arr也是arr数组的地址,是相等的

        (*p)[0] = 123;

        printf("%d ", arr[0]);

    需要注意的,p+1是从数组的首地址开始加40个字节。

    p是一个指针变量,长度为8

    *p指向一个长度为10的整形数组,长度为40

    p的类型为 int(*)[10]

    3. 指向指针的指针

    int * * p;

    *p是一个指针,指向int *类型,即p是一个指向指针的指针

    void changePointer( int **q){ //q = &p

    *q = NULL;

    }

    int a ;

    int *p = &a;

    changePointer( &p); //可以修改p指针变量的指向

    二、二维数组传参

    数组名就是数组首元素的地址

    void func( int (*p)[5] ){

        p[0][0] = 123;

    }

        int arr[4][5] = {};

        func(arr);      // arr == &arr[0],arr[0]是一个长度为5的数组,函数需要一个指向5个元素数组的指针变量作为形参

        printf("%d ", arr[0][0]);

    作业:

    int ** p[10]; 作为参数传递形参应该怎么接收?

    int x[3][4];  形参如何接收

    三、了解的复合类型

    1. int * p(int); //声明一个函数p,有一个整形参数,返回一个指向整形数据的指针

    2. int ( *func(int))[10];  //声明一个函数,返回一个指向数组的指针,函数的返回值就是盖住函数调用部分,其他的就是函数的返回值。

    int ( * fun (int x )) [10] {

    return NULL;

    }

    int (* ret) [10] = func(10);

    ret = func(5);

    3. int (*p) (int); //一个指向函数的指针

    int add ( int x, int y){

        return  x+y;

    }

    int multi( int x ,int y){

        return  x * y;

    }

    int main(int argc, const char * argv[]) {

        int (*p)(int, int ) = add; //p是一个指向函数的指针,定义的同时进行初始化

        printf("%d ",  p(3,4) ); //通过函数指针调用函数和直接使用函数名调用函数是一样的

        p = multi; //函数名就是函数的入口地址,当程序编译后,函数就会保存到代码区,函数的地址就已经确定好了,

        printf("%d ", p(3,4));

         

        return 0;

    }

    //例:函数入口地址

    int testFunc( int n ){

    printf( “func: %p ”, testFunc);

    printf(“ &n=%p ”, &n);

    if(n == 1 ) {

    return 1;

    }else{

    return n & testFunc(n-1);

    }

    }

    函数指针的作用:

    1)将函数指针作为参数,可以提高代码的复用度

    2)用于函数的回调

    四、复合类型的确认

    int ( *p[10] )[10];

    //p是一个数组,有10个元素,p数组元素的类型是int(*)[10],int(*X)[10]这个类型也是一个指针,该指针指向一个含有10个整数的数组

      int(*p[10])(int);

    p是一个数组,有10个元素,每个元素又是一个指针,该指针指向有一个整形参数,返回整数的函数。

    int *(*p)[10]; 

    p是一个指针,这个指针指向一个数组,这个数组有10个元素,数组的每个元素又是一个指向int类型变量的指针

    int (*(*func[10])(int))(int);

    func是一个数组,每个元素是一个指针,int(*(X)(int))(int), 这是一个函数指针,int(*B)(int)这个函数指针返回一个函数指针。

  • 相关阅读:
    路径查看linux 向内核注册总线例子
    属性应用Android Manifest之<provider>元素中文注释
    序数序列hdu 1394
    大分类分类Zen Cart大分类下直接显示产品列表插件
    虚拟化运行[OpenStack] VMWare产品介绍
    名称磁盘Linux系统监控的CPU、Mem、IO的OID
    端口服务器黑马韩前成linux从入门到精通proftpd服务器配置
    主库配置关于Dataguard Online redo log 和 Standby redo log
    尺寸品牌Jquery 仿淘宝京东多条件筛选 可自行结合ajax加载
    设置编辑(iPhone/iPad开发)设置UITextView为不可编辑状态
  • 原文地址:https://www.cnblogs.com/ljcgood66/p/5281275.html
Copyright © 2011-2022 走看看