点击链接加入群【C语言】:http://jq.qq.com/?_wv=1027&k=2H9sgjG



好,不知不觉已经来到了第五小节了,其实我们的C基本已经讨论了一大半了,只要你把指针的概念弄清楚了,你的C路就已经起步了,好吧,我们继续来讨论指针。我们还是先来加快一下指针的定义,我们给它下的定义 是 指针是变量,是用来记录地址的变量,那么如何取得一个有效的地址呢?比如我们有一个整数val,那么我们可以通过 &(英文会读吗,爱木泼散德,哈哈,键盘上的特殊符号英文怎么读,这个任务嘛,交给读者了哦,如果你不会,你需要掌握一下这个技能哦) 这个符号来取得val的首地址,还记得首地址这个概念吧,很好理解的哦。那么& 取得的首地址其实是有类型的哦,就是变量的类型,如

你 val是char型的,那么&val 得到的就是char * 类型,如果 val是整型的,那么&val 得到的就是 int *,总之 type val = x; &val 取到的地址是 type * 的,这个对指针也是一样的哦,意思是 如果 int * p = x; &p 取到的地址类型就是 int * * ,能理解吧,,反正我感觉应该不是很难理解。

其实这些东西在编译的时候会给出提示的,如下图

C语言入门篇-05_C语言学习


所以放心吧,系统会帮我们检测地址类型的哦,那么为了消除这种错误,我们可以使用强制类型转换哦,也就是在 &val 前面 加上 (char *) ,进行类型强制转换。很好理解不是嘛。。。


好了,我们现在知道如何获取一个地址了,那么当我们有一个地址之后,有什么用吗?答案是肯定有用的。这就要谈到另一个运算符了,,叫 *(爱斯特锐斯克) 运算符,那么它怎么用呢?其实用法很简单,就是在它后面跟上一个 地址,怎么理解呢?我们来看下面的解释

*地址A: 我们解释过,地址是有类型的哦,那么这个意思就是 在 地址A起始位置向后取 类型所占字节数 个字节,唉,我打字的时候已经感觉到这句说的挺绕,我语文学的不好,哈哈,你就忍忍吧,我来举几个例子你就明白了啊,,如果地址A是 int * 类型的,值是0X0012FF7C,那么我们通过*地址A就把0X0012FF7C - 0X12FF7F 里的值取到了,如果地址A是char * 类型的,值是0X0012FF7C,那么我们通过*地址A就把0X0012FF7C这一个字节的数据取到了,不难吧,所以说嘛,当时再说类型这个概念的时候,我就说过它是灰常灰常重要的呢。因为我们后面会经常用到它。现在来讨论一下前面留下的问题吧,如何判断一个系统是小端模式还是大端模式呢?现在你是不是感觉已经非常简单了呢?

#include <stdio.h>
int main()
{
    int val = 1;
    char FirstByteVal = *(char *)&val;
    if(FirstByteVal == 1)
        printf("小端模式\n");
    else if(FirstByteVal == 0)
        printf("大端模式\n");
    else
        printf("你把我难倒了哦\n");
    return 0;
}

这个例子可以看懂吧,我们的目的就是取第一个字节,根据它是0还是1 来进行判断。这只是一种判断方法哦, 还有许多方法呢,但是在工作中,项目经理一般是不管你用什么方式的,但是他要的是结果,你必须把结果弄出来,哈哈。


记住*号后面是跟的 地址,如果我举一个例子,你也能理解,你就真的理解了。

#include <stdio.h>
int main()
{
    int val = 12;
    int * p = &val;
    int ** pp = &p;
    int *** ppp = &pp;
    printf("%d\n%d\n%d\n%d\n",val,*p,**pp,***ppp);
    return 0;
}

这段代码的结果是什么,为什么?你要推导出过程哦。

那么我们来看下图

C语言入门篇-05_C语言学习_02

还是我们的四大属性哦,能理解吧,我们仔细观察这张表,第一行是

变量 一级指针 二级指针 三级指针

然后我们再看val的首地址与p的值 ,p的首地址和pp的值 ,pp的首地址和ppp的值,会发现是相同的,必须相同哦。我们*ppp取到的pp的值,而它又是一个int ** 的地址,再*一次,也就是**ppp 就相当于*(*ppp) = *(*0X0012FF74)=*0X0012FF78 = 0X0012FF7C ,理解了吗,我想你应该理解了,如果不理解也没关系,你把前五篇文章多读几次,古人说的好呀,书读万遍,其义自现,我是深有体会呀,TCP/IP第一卷你们看过吗,我看过,我看前几遍那是一个晕呀,不过后来,越看越容易理解,越看越知道它在讲什么,的确是这样的,相信我,绝对没错的。

好了,现在都已经知道指针是什么了,多级指针你也知道了,是不是感觉它没有什么用呢,哈哈,有这种感觉太正常了。因为我们还不知道什么叫函数呢。函数又是怎么回事呢?当我们把它弄清楚后再来讨论这个指针的用处,其实我们现在已经把理论知道掌握的很好了。许多工作多年的人 连指针是什么都搞不懂呢,,唉,不想多说什么了,哈哈,你懂的。

下一讲,我们会详细讲一下栈这个东西。很邪恶的哦。大家一定要注意基础的知识,因为基础很重要。