zoukankan      html  css  js  c++  java
  • 指针

    相关概念

    1.指针数组:int *p[6]                               数组,是一个存放指针的数组,也就是里面存放的是地址。

    2.数组指针:int (*p)[6]                               是指针,该指针指向一个数组。

    3.函数指针:int* (*fun)(int *p1,int *p2)               是指针,该指针指向一个函数,函数的返回值是一个地址。

    4.函数指针数组:int *(*fun[6])(int *p1,int *p2)                   是数组,存放的是函数指针的数组。

    5.指向函数指针数组的指针:int *(*(*fun)[6])(int *p1,int *p2)     是指针,指针指向一个数组,数组的元素为函数指针。

    6.指针函数                           是函数,返回值是一个地址值,函数返回值必须用同类型的指针变量来接收

    看出来点规律没???可以这样读   指针数组,加一个;数组指针;函数指针;看 后面的定语是什么,这个变量表示的就是什么。

    解释

    1.指针数组

    首先这是一个数组, 而数组中存的是指针,强调的是数组,数组,数组。还有数组占多少字节由数组本身决定。它是“储存指针的数组”的简称。

    这里需要明白一个符号之间的优先级的问题,“[ ]”“ * ”的优先级要高,p1会先和“[ ]”结合,构成一个数组,数组名为p,int *修饰的是数组的内容,

    即数组的元素。那么int *p[4];就清楚了,它是一个数组,存了4个指向int数据类型的指针,即指针数组。 

    int *p[6];
    cout<<sizeof(p[0])<<endl;//8
    cout<<sizeof(p)<<endl;//48

    一个指针在32位的机上占四个节,在64位的机上占8个字节。

    2:数组指针

    那现在清楚了,它是一个指针,它指向数组,强调的是指针,指针,指针,这个指针是指向一个数组的,int (*p)[4];就更好解释了,

    在这儿()的优先级比[]的优先级高,那么 p 先和*结合,说明 p 是一个指针,p是指针变量名。int修饰数组的内容,即数组的每个元素。

    数组在这里没有名字,是一个匿名数组,p 是一个指针,它指向一个包含4个int类型数据的数组,即数组指针。 

    int (*p)[6];
    cout<<sizeof((*p)[1])<<endl;//4输出的数组中的第二个元素所占的字节大小,因为每个数据类型都为int型,所以占4个字节
    cout<<sizeof(p)<<endl;//8输出的时p所占的字节大小,p为指针,所以p占八个字节。

    等同于 int (*)[6] p;

    3.函数指针

    与它    int *(*)(int *p1,int *p2) fun;等价。

    这是一个函数指针,fun 是一个指针变量名,指向一个函数,这个函数有两个参数,分别为整型指针 p1 和字符这个指针 p2 ,函数的返回类型是整型指针类型。

    4.函数指针数组

    int* (*fun[6])(int* p1, int* p2) ;它是一个数组,数组名是 fun 。数组中存了6个指向函数的指针。我把它变换一下 你在来看int* (*)(int* p1, int* p2) fun[6] ;

    这6个指向函数的指针指向 。重点是要明白这时一个数组。

    5.函数指针数组

    int* (*(*)[6])(int* p1,int* p2) fun 听我解释:fun 首先是一个指针,这个指针指向一个包含了6个元素的数组;这个数组里面存的是指向函数的指针;

    这些指针指向一些返回值类型为指向整型的指针、参数为一个指向整数的指针的函数.

    6.指针函数

    指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针

    float *fun();
    float *p;
    p = fun(a);

    最简单的辨别方式就是看函数名前面的指针*号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数。

    当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中。

    函数返回的是一个地址值,经常使用在返回数组的某一元素地址上。

    int * GetDate(int wk,int dy);
    
            main()
            {
                int wk,dy;
                do
                {
                    printf(Enter week(1-5)day(1-7)
    );
                    scanf(%d%d,&wk,&dy);
                }
                while(wk<1||wk>5||dy<1||dy>7);
                printf(%d
    ,*GetDate(wk,dy));
            }
    
            int * GetDate(int wk,int dy)
            {
                static int calendar[5][7]=
                {
                   {1,2,3,4,5,6,7},
                   {8,9,10,11,12,13,14},
                   {15,16,17,18,19,20,21},
                   {22,23,24,25,26,27,28},
                   {29,30,31,-1}
                };
                return &calendar[wk-1][dy-1];
            }

    子函数是返回某元素的地址,主函数中输出该地址对应的元素的值

    (*(void(*)())0)(); 
    //调用0地址处的函数,该函数为没有参数,返回类型为void的函数 
    //该代码是把0强转成函数指针,然后再解引用找到函数再调用 
    
    void(*signal(int, void(*)(int)))(int); 
    //是一个函数声明,signal是一个函数, 
    //参数为int类型和函数指针类型,返回值为函数指针类型
  • 相关阅读:
    37. Sudoku Solver(js)
    36. Valid Sudoku(js)
    35. Search Insert Position(js)
    34. Find First and Last Position of Element in Sorted Array(js)
    33. Search in Rotated Sorted Array(js)
    32. Longest Valid Parentheses(js)
    函数的柯里化
    俞敏洪:我和马云就差了8个字
    vue路由传值params和query的区别
    简述vuex的数据传递流程
  • 原文地址:https://www.cnblogs.com/tianzeng/p/9063514.html
Copyright © 2011-2022 走看看