嵌入式C语言之C语言的高级表达与指针的高级应用

指针数组与数组指针、函数指针: 
        
        指针数组  int *p[5]   相当于int *(p[5])  (数组内的每个变量为指针变量)
                     首先是一个数组,其次数组内的元素都是指针类型。
        指针数组的实质是数组,这个数组内存放的元素是指针类型的。
        
        数组指针 int (*p)[5]   首先是一个指针,其次指针指向一个数组,数组内的元素为int类型
        数组指针的实质是指针,这个指针指向对应的数组。
        
        注:*的优先级小于[];
        
        函数指针:本质还是指针变量,只是指针指向的是一个函数。函数的实质是一段代码,这段代码的地址在内存                      之中是连续分布的。所以对于函数来说,最重要的时函数第一句代码的首地址,这个地址就是此函数的地址。
       (相当于数组,只要知道数组的首元素的首地就可以知道每个元素的地址)
        函数名做右值时,加不加&效果和意义是一样的,凡是数组做右值时不同。


int*[]         指针数组:1.是一个数组2.数组的内容是指针3.大小由[]内的内容决定4.指针指向的内存大小由int决定

int (*)[]  数组指针:1.是一个指针2.指针指向的是一个数组3.数组的内容是int型4.数组的大小由[ ]内内容决定

int(*)()函数指针:1.是一个指针2.指向的是一个函数3.函数的返回值是int型(函数没有类型,只有函数返回值有类型)4 .                                     函数指针指向的内存大小由函数决定

int(*[])()函数指针数组:1.是一个数组2.数组内放的是函数指针3.数组的大小由[ ]的内容决定3.指针指向的是函数(函数名不加                                        ()代表函数地址,函数名加()代表函数调用

int*[]  、int (*)[]、int(*)()、int(*[])()都属于数据的类型,只是将此种数据类型的变量名提至前面。而不是放在了最后。(前四种相当于int a[]的数据类型为int [],而变量名a提至前面)


结构体内嵌函数指针实现分层:
    复杂程序的编写必须分工,分工的前提是分层。(示例:简单的计算器的实现。上层程序实现程序框架,下层实现计算器具体的程序。实际上上层程序调用下层程序)
    下层代码核心是结构体变量:1.定义结构体变量 2.填充结构体变量 3.调用上层写好的接口函数,把结构体变量传给他即可。
    上层代码:注重业务逻辑,注重要实现的功能,与我们最终的目标相关联。
    
->的使用:通过结构体指针变量直接获得结构体变量的成员变量。
          一般的形式:结构体指针变量->成员变量。
          例如:struct stu 
          {
             int a;
             int b;
             pFunc =p;(假设pFunc为一个指针函数的函数名)
          }
          
          void jisuan(struct stu *stu1)
          {
                stu1->p(stu1->a,stu1->b);  此时就获得了结构体内的成员变量。
          }
    

typedef :
        typedef 定义的是类型而不是变量(类型是一个数据模板,变量是一个实在的数据,且类型不占内存)
        在面向对象中,类型就是类class,变量就是对象。
        
        typedef +原有的数据类型+新定义的数据类型;
        define +新定义的数据类型+原有的数据类型
        定义完在}后面必须加;分号。

二重指针:char *类型的变量可以通过再次取地址&得到二重指针char **类型;
          1.二重指针多用来指向指针数组。
        例:  
    int *p1[5];
    int *p2;
    int **p3;
    
    p3=p1;  //p1是指针数组名,本质是数组名,做右值表示数组的首元素首地址
         2.在实际编程中,多用于函数传参时为了通过函数内部改变外部的一个指针变量。
         
二维数组的指针引用:a[i][j]=*(*(p+i)+j);          
                     (此时的*(p+i)其实是一个*(p+i)的地址)
                二维数组的数组名表示二维数组的第一维数组的首元素的首地址
                

猜你喜欢

转载自blog.csdn.net/qq_41464499/article/details/83154379