zoukankan      html  css  js  c++  java
  • 指针数组,数组指针,函数指针,main函数实质,二重指针,函数指针作为參数,泛型函数

    

    1、指针数组

       数组里面的每一个元素都是指针。

       指针数组的案比例如以下:

       易犯错误:

    2、数组指针

      归根结底还是指针,仅仅是取*的时候可以取出一整个数组出来。

    数组指针:(一个指针指向了数组。一般和二维数组搭配使用)。

    以下的(p+1)表示的是加过20个字符。

     

    3、函数指针:

    gcc编译的时候添加一些调试信息的方式是:

    gcc demo.c –g –o app   -g表示添加一些调试信息

    objdump –dSsx app > file   app反汇编。然后重定向到file文件里。函数指针定义:

     

    4、指针作为參数

     

    sizeof(p)

    sizeof(*p)

    p+1

    char *  p[10]

    40

    4

    加过4Byte

    char **p

    4

    4   注意sizeof**P= 1

    加过4个字节

    char (*p)(void) 函数指针

    4

    无大小

    无意义

    char (*p)[20]  数组指针

     

     

    20

     

    5main函数实质介绍:

     

    6、二重指针:

    指针数组和二重指针实际上是等价的。

     

    7、数组指针等价于二维数组:

                                                                                                                                                     

    8、函数指针作为函数的參数

     

    9、泛型函数:

    #include <stdio.h>

    #include <time.h>

    #include <stdlib.h>

     

    void show_arry(int a[], int n)

    {

             inti;

             for(i = 0; i < n; i++)

                       printf("%d ",a[i]);

             putchar(' ');

    }

    void init_arry(int a[], int n)

    {

             inti;

             srand(time(NULL));

             for(i = 0; i < n; i++)

                       a[i]= rand() % 100;

    }

    int cmp_int(void *a, void *b)

    {

             intx = *((int *)a);

             inty = *((int *)b);

             returnx > y;

    }

    void swap_int(void *a, void *b)

    {

             inttmp;

             tmp= *((int *)a);

             *((int*)a) = *((int *)b);

             *((int*)b) = tmp;

    }

    //泛型模板是通过void *的方式得到的。

    void bubble_sort(void *a, int n,int(*cmp)(void *, void *), void (*swap)(void *, void *))

    {

             inti, j;

             for(i = 0; i < n; i++)

                       for(j = 0; j < n-i-1; j++)

                                if(cmp((void *)((int *)a+j), (void *)((int *)a+j+1)) > 0)

                    //注意这里的(int*)仅仅是告诉编译器传递的是4个字节的长度,对于float的也是四字节的。

                                         swap((void*)((int *)a+j), (void*)((int*)a+j+1));

    }

    /*

    int main(void)

    {

             inta[10];

             init_arry(a,10);

             show_arry(a,10);

             bubble_sort(a,10, cmp_int, swap_int);

             show_arry(a,10);

    }

    */

    int cmp_float(void *a, void * b)

    {

             return*((float *)a) > *((float *)b);

    }

    void swap_float(void *a, void *b)

    {

             floattmp;

             tmp= *((float *)a);

             *((float*)a) = *((float *)b);

             *((float*)b) = tmp;

     

    }

    void show_float(float a[], int n)

    {

             inti;

             for(i = 0; i < n; i++)

                       printf("%f ",a[i]);

             putchar(' ');

    }

    int main(void)

    {

             floata[5] = {1.3, 4.5, 2.3, 1.2, 3.7};

             bubble_sort(a,5, cmp_float, swap_float);

             show_float(a,5);

    }

  • 相关阅读:
    『实践』Yalmip建模+Cplex类求解(文末附程序、文章和算例)
    『实践』Matlab实现Flyod求最短距离及存储最优路径
    『转载』Matlab中fmincon函数获取乘子
    『实践』Yalmip获取对偶函数乘子
    『转载』hadoop 1.X到2.X的变化
    『转载』hadoop2.x常用端口、定义方法及默认端口
    『实践』VirtualBox 5.1.18+Centos 6.8+hadoop 2.7.3搭建hadoop完全分布式集群及基于HDFS的网盘实现
    C#设计模式学习笔记:(6)适配器模式
    ASP.NET 开源导入导出库Magicodes.IE 导出Pdf教程
    Rx基础
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/6917983.html
Copyright © 2011-2022 走看看