对于指针总结与高级应用

C语言中对于高级指针话题的总结

在C语言中对于指针最开始接触得到的话题就是在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。

一开始接触到的指针几乎都是直接指向一个比较简单的变量 , 例如对于一段c代码:

#include <stdio.h> 
int main() 
{
    int a = 10;
    int* p = &a;
}


对于上述代码中 p 就是一个典型的指向整型的指针, 对于指针而言, 对它进行解引用, 可以实现通过地址的形式来访问数据, 同样指针的优势在于能够很好的解决在一些函数中要改变其主函数内部的值(为什么无法直接通过传值来改变主函数中的参数可以翻之前的“栈帧”那一篇博客)

//对于指针的作用可以在一个很典型的交换函数中感受到

#include <stdio.h>
#include <assert.h>

int main()

void Swap(int a1, int a2)
{   
    a1 ^= a2;
    a2 ^= a1;
    a1 ^= a2;
} //传值


void _Swap(int* p1, int* p2)
{
    assert(p1);
    assert(p2);
    *p1 ^= *p2;
    *p2 ^= *p1;
    *p1 ^= *p2;
} //传址



{   
    int a = 10;
    int b = 20;
    Swap(a, b);
    _Swap(&a, &b);
    return 0;
}

上述的函数中运行之后可以得到 Swap 函数并没有将a,b交换, 反而是_Swap函数能够进行交换, 所以直接传值和传地址之间的差别就能体现出来了, 更要注意的是在函数传递参数时, 传指针是占四个字节, 但是传值的形式的话有可能是一个空间巨大的结构体, 要在栈上形成一个大的临时变量,这样的情况下可能会降低性能,不过传值可以有效避免在操作过程中对于参数的污染, 可以有效保护主函数不需要被修改的值

在C语言中,指针不单单可以指向一个变量,其他更有高级的用途,下面来总结一下指针的高级用法:

1.函数指针

函数指针是指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。函数指针有两个用途:调用函数和做函数的参数。

//函数指针的使用
//当一个函数的某个参数是另外一个参数时的情况
//举例大小堆的构建方法
#include <stdio,h>

void _Big(...)
{
    ...
}//构建大堆

void _Small(...)
{
    ...
}//构建小堆

void (*Ptr)(...); //函数指针指向大小堆的一系列类型指针

void CreateHepa(int* arr, int size, void (*Ptr)(...))
{
    ...
}

int main()
{   
    int arr[] = {...};
    int size = sizeof(arr)/sizeof(arr[0]);
    CreateHeap(arr, size, _Big);
    CreateHeap(arr, size, _Small);
}

2.函数指针数组

函数指针数组是由函数指针构成的数组,在编程的过程中,就类似普通数组是一连串类型相同的变量集合, 函数指针数组就是指向一连串返回值相同, 参数类型相同的函数集合

//函数指针数组实现加减法计算器
#include <stdio.h>

i
int _Addtion(int a, int b)
{
    return a + b;
}

int _Substraction(int a, int b)
{   
    return a - b;
}

int (*Ptr[])(int a, int b)//函数指针数组
 = {_Addtion, _Substraction};

int Cal(void)
{
    int a = 0;
    int b = 0;
    int ret = 0;
    char mark;
    scanf("%d%d", &a, &b);
    scanf("%c", &mark);

    switch(mark)
    {
    case mark == '+':
         ret = Ptr[1](a, b);
         break;
    case mark == '-':
         ret = Ptr[2](a, b); 
         break;
    }

    return ret;
}

int main()
{   
    printf("%d", Cal());
    return 0;
}

猜你喜欢

转载自blog.csdn.net/liu_zhen_kai/article/details/80573466
今日推荐