指针复习断断续续两个星期,基本告一段落,心得笔记与大家一起分享知识,指针用我的体会来说,简直是玄之又玄,众眇之门。
整个学习其实是围绕指针与指针变量两个关键点,指针与指针变量个人理解如下:
指针:
我们声明定义变量(×××、字符串、函数等),变量会存于常量区、栈内存等里面,指针就是用于指向他们存储的位置,更贴切的说指针也是需要开辟空间的,指针的值就是我们存储的变量。
指针变量
指针 变量只能存放指针,听起来很绕口,就是只能存地址,不可以存变量。
两个符号操作如下
*号用于取值操作,&用于取地址操作。
光说基本是理解不了的,来代码中详细咱们在详细解释

#include 

void main()
{

    int *p1,*p2,*p,a,b;//*p1,*p2,*号开头的都是声明的指针变量

    scanf("%d,%d",&a,&b);
    p1 = &a;//&a是a的地址(a的指针),*p1指针变量存放a的地址,这就是指针与指针变量的关系
    p2 = &b;

    if( a < b)
    {
        p = p1;
        p1 = p2;
        p2 = p;
    }
    printf("%d,%d\n",a,b);//变量值,同等于下
    printf("%d,%d\n",*&p1,*&p2);//右到左,先&后*,意思取&a地址,然后*取地址的值。

    printf("%d,%d\n",&a,&b);//取变量值的地址同等于下
    printf("%d,%d\n",&*p1,&*p2);//右到左,先*后&,意思取*a的变量值,然后&取值的地址。

    printf("%d,%d\n",*p1,*p2);//p1里面存的是地址变量,*取p1里面的值(地址变量),同等于a,b;
}

下面板块聊聊数组(一维与多维)如何去定义
一维数组与二维数组或者三维、四维数组,在真正存储内存中以线性进行存储,都是成一条线的,存储在栈内存,栈内存如先进先出等机制,可读可写。代码中有详细的注释,我们思路可以把多为数组用一维数组的思想去循环

#include 
#define M 10

void reversion(int *q1,int *q2);
void printf_io(int *q1);

void main()
{

    int i,*q1,*q2,array[M],arrays[M];
    q1 = array;//等于数组第一个元素变量地址array[0];
    //q2 = arrays;//有办法让q2指针等于arrays[9]吗?
    q2 = &arrays[9];

    printf("Please enter numbers:\n");
    for(i = 0;i
        }
        else
        {
            printf("%d-->",*(q1+j));
        }
    }
    printf("\n");
}

第三个板块说一说类似于oo中多态概念,如何用指针来实现调用同意一个函数去实现不同的功能。
补充:我们知道五大区块,定义的字符串是声明到常量区的,只读不可写。而定义的数组之类定义在栈内存,先进先出,可读可写。这样如果我们用指针变量声明一个字符串常量(初始化之后不可改变属性),想把字符串常量的值做改变(把其他值复制或者改变属性),会出现报错,提示无法写的概念。

#include 

int process(int (*p)()); 
int max(int a,int b);
int min(int a,int b);
int sum(int a,int b);

void main()
{

    int a,b;
    int (*p)(),(*p1)(),(*p2)();
    printf("Please input a/b numbers:\n");
    scanf("%d,%d",&a,&b);

    p = max;
    p1 = min;
    p2 = sum;

    printf("%d\n",process((*p)(a,b)));
    printf("%d\n",process((*p1)(a,b)));
    printf("%d\n",process((*p2)(a,b)));
}

int max(int a,int b)
{
    if(a>b)
    {
        return a;
    }
    else
    {
        return b;
    }

}

int min(int a,int b)
{
    if(a>b)
    {
        return b;
    }
    else
    {
        return a;
    }

}

int sum(int a,int b)
{
    int sum;
    sum = a+b;
    return sum;
}

int process(int (*p)())
{
    int z;
    z = p;
    return z;
}

本代码确实有一定的逻辑Bug,有些逻辑不严谨(传参),后续会继续改进,只有敲过才知道指针灵活强大无比,很随心所欲。当然层面深了多线程之类会出现越界严重等问题。在补充一些,指针变量都是指向数组的首个地址,如一维数组来说p=a(*p = a[0]),我们传参不用吧整个数组传递,只需要把首地址传递即可,我们也可以根据需要移动指针即可。文采水平有限,表达可能并不是那么生动,只有亲手去敲了才能体会奥妙所在。