码迷,mamicode.com
首页 > 其他好文 > 详细

无法言喻的奥妙

时间:2018-05-06 10:40:16      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:指针   指针变量   C   类多态   概念   

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

#include <stdio.h>

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 <stdio.h>
#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<M;i++)
    {
        scanf("%d",&array[i]);
    }

    reversion(q1,q2);
    q2 = arrays;//把指针调回来!q2 = arrays[0] 而不是 arrays[9]
    printf_io(q2);

}

void reversion(int *q1,int *q2)
{
    int k;
    printf("Is the transformation\n");
    printf("Please wait a moment\n");
    for(k = 0;k<M;k++)
    {
        *(q2-k) = *(q1+k);//array[0]数组元素赋值给arrays[9];
        printf("%d = %d\n",&*(q2-k),*(q2-k));//根据数组地址判断是否重末尾赋值
        printf("%d = %d\n",&*(q1+k),*(q1+k));
    }
    printf("Conversion success!\n");
}

void printf_io(int *q1)
{
    int j;
    printf("output array reversion sort:\n");
    for(j = 0;j<M;j++)
    {
        if(j == 9)
        {
            printf("%d",*(q1+j));//输出最后一个数组元素去掉-->
        }
        else
        {
            printf("%d-->",*(q1+j));
        }
    }
    printf("\n");
}

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

#include <stdio.h>

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]),我们传参不用吧整个数组传递,只需要把首地址传递即可,我们也可以根据需要移动指针即可。文采水平有限,表达可能并不是那么生动,只有亲手去敲了才能体会奥妙所在。

无法言喻的奥妙

标签:指针   指针变量   C   类多态   概念   

原文地址:http://blog.51cto.com/13352079/2113041

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!