发新帖本帖赏金 5.00元(功能说明)我要提问
123
返回列表
打印
[C语言]

我多年锤炼的小伙伴入职C语言培训案例,长篇连载中

[复制链接]
楼主: 小马儿
手机看帖
扫描二维码
随时随地手机跟帖
41
小马儿|  楼主 | 2016-8-30 18:03 | 只看该作者 回帖奖励 |倒序浏览
最近家人住院了, 整天忙绿中, pdf还没弄呢, 让大家久等了, 弄好后, 给大家链接.
当家人出院后, 开始写后续的例子2和例子3, 希望能帮助到正在嵌入式行业这条路上奔波的人.

使用特权

评论回复
42
ljp98| | 2016-9-10 09:04 | 只看该作者
好**。支持!

使用特权

评论回复
43
小马儿|  楼主 | 2016-10-14 11:01 | 只看该作者
入职C语言训练例子二,强化指针概念(1)
指针是C语言中最基本且很重要的概念,某种程度上可以说,指针是C语言的灵魂。

然而,很不巧的是,我们公司新招聘的好多小伙伴对C语言的指针都比较陌生,猜测背后的原因,可能要拜人性中的“选择性遗忘”了。

因此,在入职C语言训练中,指针强化训练成为必不可少的步骤了,本篇**,我们先来理一理指针的概念。

C语言中对指针的定义是保存地址的变量,我刚开始学习C语言的时候,感觉这是一个很low的概念,但栽了无数个跟头后,自己反而开始糊涂了,不知道该如何理解指针了,挺像一个汉字越看越不像的感觉,不知大家是否有同感。

后来在多年的培训实践中,我尝试了一种对比提炼法,并提出了一种新的概念,期望能帮助我们的小伙伴加深对指针的理解。

1. 硬件层面的指针概念:
追根溯源,我们先来看最底层的汇编程序(直面硬件体系结构了)是如何定义数据变量的,如下arm代码片段:
value1:
    DCD    0x11
    DCD    0x22
value2:
    DCB    "welcome"

上述这段代码定义了两个变量,value1和value2。我们习惯性认为value1对应了两个字(32位),value2对应了一个字符串,但实际上,value1和value2仅是一个地址标注,value1后面可以逻辑的认为字符串,而value2后面也可以逻辑的认为一个字,而上面定义的主要目的是用于连接器内存分配连接的。

因此,在汇编语言(硬件体系)层次,所有的变量定义本质上都是地址(指针),至于地址里面存储的是什么东西,在汇编语言语义级别没有语义规定,完全由我们发挥了。

2. C语言中的指针

进入C语言后,为了编程的方便性,我们开始增加语义,数据有类型了,因此也出现了各种数据类型的指针,如int*和float*有着不同又相同的含义。

说其相同,是因为都是指针,说其不同,是因为指针语义存在着差异。

因此,此时指针的含义,不能仅仅的理解为一个地址,还需要关注地址指定的对象。但同时,也需要记住指针仅仅是地址,因为这是指针作为变量本身的规则。

在C语言中,大家应该都知道,C语言中有且仅有值传递这一种方式,也就是说,传递给被调函数的参数值存放在一个临时变量中,而不是存储在原始变量中。更详细了说,一个函数传递参数和返回值,一个赋值语句拷贝过程,都是完整字节拷贝模式,即使传递的是一个对象(结构体),也是老老实实的拷贝。如果传递的是一个指针,是以指针的本质(地址)进行拷贝的。

比较下面几条代码片段:
int fun1(int a);
struct A fun2(struct A a){struct A b;……;return b;}
struct A* fun3(struct A* a);

fun1函数的值拷贝,大家会感觉比较自然好理解,函数内部怎样折腾变量a,都不担心对外部的影响。
fun2参数和返回值的传递都是对象逐个字节拷贝,当然要意识到这种代码不好,在嵌入式系统中要尽量回避。
fun3参数和返回值的传递是指针本身,但间接达到了对象的引用传递效果而已。

3.高级语言中的“指针”

我们经常说C语言是中级语言,为何呢,我个人的理解是:C语言仅引入了有限的语义,同时保留了大量的汇编级别语言的特性。如数组的概念,本质上依旧是指针而已,没有增加过多的语义概念。

但是随着编程理念的发展,各种新语义概念开始层出不穷。

C++中额外增加了一种对象引用的概念,这是对对象的操作抽象。但可悲的是,C++既需要兼容设计,又需要拓展设计,最终导致成了一种杂合语言,大家经常会争论于指针和引用的区别。

随着语言的发展,新的高级语言会逐渐的取消指针概念(主要目的是规避指针带来的各种缺陷),而加强对象引用的概念,如java语言。

此时,回头再来理解C++中的指针和引用,会发现他们的区别几乎是本质上的(引用的本质是对象操控,指针的本质是地址)。进一步前溯,会更容易理解C语言赋予在指针上的语义概念。

4. 总结:
回头再来看我们对C语言中的指针定义:不仅是一个地址,更需要关注它指向的内容,以及与此关联的语义。而下篇**,我们就来谈一谈大家容易忽略的C指针语义概念。

我是小马儿,一个渴望良知与灵魂的工程师,欢迎您的陪伴与同行。


使用特权

评论回复
44
一个拥抱| | 2016-10-14 11:39 | 只看该作者
justtest111 发表于 2016-8-14 14:27
int n = 3,4;
这个不是错误的声明吗?

估计是什么少见的用法

使用特权

评论回复
45
sepmoon| | 2016-10-14 18:13 | 只看该作者
一个拥抱 发表于 2016-10-14 11:39
估计是什么少见的用法

我认为只执行了n=3,逗号后面的4因为没有什么操作,编译会自动忽略,不起作用。不知道理解的对不对。
正常不会这么写,虽然语法没错。

使用特权

评论回复
46
sepmoon| | 2016-10-14 18:15 | 只看该作者
小马儿 发表于 2016-10-14 11:01
入职C语言训练例子二,强化指针概念(1)
指针是C语言中最基本且很重要的概念,某种程度上可以说,指针是C ...

对指针运用的熟练程度也可以看出一个人的C语言能力

使用特权

评论回复
47
一个拥抱| | 2016-10-14 19:24 | 只看该作者
sepmoon 发表于 2016-10-14 18:13
我认为只执行了n=3,逗号后面的4因为没有什么操作,编译会自动忽略,不起作用。不知道理解的对不对。
正常 ...

下面说了 ,楼主打错了;正确的应该是:
int n;
n=3,4;

这种用法是对的

使用特权

评论回复
48
sepmoon| | 2016-10-16 15:27 | 只看该作者
一个拥抱 发表于 2016-10-14 19:24
下面说了 ,楼主打错了;正确的应该是:
int n;
n=3,4;

这个我看到了,我说的也是指n=3,4应该等于多少

使用特权

评论回复
49
hcszheng| | 2016-10-22 21:34 | 只看该作者
感谢楼主!

使用特权

评论回复
发新帖 本帖赏金 5.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则