零基础如何快速精通C语言?要注意什么?

精通C语言是有难度的,却也不是没有方法。

首先,内存意识。

C语言和其他高级语言不一样,它的很多操作都是直接面向内存(面向硬件)。

困难的是,对于C语言,不论是数据类型、操作符、语句、函数,都或多或少、或简单或复杂地通过地址操作内存。

幸运的是,一旦掌握内存,代码功能会非常强大,执行效率非常之高。

举个例子。

如何把一个二进制数转换成十进制以字符的形式输出?

做过十进制位数分离的程序员都知道,可以采取“模10再除10”的方法把一个二进制数按十进制分离每一位。

尝试着去理解下面的程序。

while(putchar(value % 10 + '0') && (value /= 10))

;

putchar()函数的原型是int putchar(int ch);执行结束返回1。

这个代码风格已经算优质了,只不过这样是倒序的,想要实现正序排列可以使用递归。

void binary_to_ascii (unsigned int value)

{

unsigned int quotient;

quotient = value / 10;

if(quotient != 0)

binary_to_ascii(quotient);

putchar(value % 10 + '0');

}

但是当你明白了字符串常量的原理后,你可能会写出这样不平凡的代码。

while(putchar( "0{{123456789:0}}" [value % 10] ) && (value /= 10))

;

这是因为,一个字符串常量存储在内存的某一位置,调用它的时候,并没有把整个字符串传递进去,而是只传递一个指针常量(一个地址),然后执行和数组相同原理的下标引用。没错,你可能猜到了,也猜对了,数组名也是一个指针常量。

小编推荐一个学C语言/C++的学习裙【 六二七,零一二,四六四 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

其次,掌握原理。

掌握哪些原理?数据类型、操作符是重点。

典型的,指针、数组、结构体、一些重点操作符。

以操作符为例:

++操作符:a++和++a它们的机制分别是什么?

a++:我们称为后++,首先a生成一份拷贝,然后a执行++,最后返回拷贝。返回的拷贝值是旧a,新a已经执行了++操作。

++a:我们称为前++,首先a执行++,然后a生成一份拷贝,最后返回拷贝。a先执行++,再拷贝,返回的拷贝就是新a。

如何理解拷贝?简单学习汇编语言,了解机器内部的运算方式,就可以理解。

&&和||操作符:先执行左表达式,再执行右表达式,如果左表达式就能确定整个结果,则不执行右表达式。

如果你知道while语句和scanf()、putchar()的原型,那么下面这个语句将不难理解。

while(scanf("%d", ch) && ch != EOF)

putchar(ch);

scanf()换成getchar()也可以,这里只是想提醒大家scanf()的原型。

如果你足够理解for语句和表达式,看下面这个代码。

int a[n], *vp;

for(vp = a; vp < &a[n]; ){

*vp++ = 0;

}

这个代码有两个问题:功能是什么?是否有错误?

第一个问题:功能是实现数组的初始化。

第二个问题:没有错误。其一,&a[n],指向数组外,指向并不会有错误,但是不能执行间接访问,即*vp=a[n]是非法的。其二,for语句,括号内需要三个表达式,最后一个不写,表示空表达式,空表达式也是表达式。

最后,清晰概念。

什么是预处理、什么是表达式、什么是语句、什么是函数、什么是操作符、什么是数据类型。

只有真正能区分它们的不同,你才能理解各种复杂的代码。

p=&a和*p=&a,在一定的语句下,都可以是正确的,它们又有什么不同?

什么是声明、什么是定义、什么是调用。

它们作用于不同的数据类型是否有本质上的区别。

比如说,声明一个变量,就要分配内存。声明一个结构体,不会分配内存,只有定义一个实体的时候,才分配。它们的实现原理不同,具体使用就会有细微的差别。

什么是常量、什么是变量、什么是指针常量char * cnost f、什么是常量指针char const *f、什么是指针函数char *f()、什么是函数指针char (*f)(),等等。

区分它们,只有一个办法,掌握操作符优先级,变量f先和什么结合,f就是什么,前面剩下的,就是返回类型。

char * cnost f:f是常量,并且是指针,返回类型为普通的char。指针常量,指针的值不能变,指针指向的数据可变,比如数组名。

char const *f:f是普通的指针,返回类型是char const。指针的值可变,指针指向的数据不能变。常量指针,面向接口编程常用的方法。

char *f():()的优先级比*高,所以f是一个函数,返回类型是一个char型指针,返回类型为指针的函数。指针函数,动态分配内存的好方法。

char (*f)():同为(),优先级相同看结合性,自左向右。f是一个指针,指向一个返回为char型的函数。函数指针,回调函数的实现方法。

掌握了上面的知识就能精通C语言么?

显然是远远不够的,我只是从我的角度总结了几个方面,给出一些建议。

而真正要做到精通,只有不断的学习。

我有一个微信公众号,经常会分享一些C语言/C++技术相关的干货;如果你喜欢我的分享,可以用微信搜索“C语言学习部落”关注

欢迎大家加入千人交流答疑裙:627+012+464

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一“技”之长

Swift解读专题二——基本类型 原

        Swift语言的常量和变量在使用之前,必须被定义。常量用于处理程序中只在初始化时设置的量值,之后不能进行赋值改变,变量用于处理程序中可以进行改变...

633
来自专栏阿凯的Excel

Python读书笔记(数字型数据)

Python与其它编程语言一样,常见的数字型无法整型(int)和浮点型两种(Float)两种。 整型就是整数,浮点型就是小数。 如果在Python中输入一个数字...

3775
来自专栏racaljk

C++11新语法糖之尾置返回类型

C++11的尾置返回类型初衷是为了方便复杂函数的声明和定义,但是当复杂度稍微提升一些的时候很明显能注意到这种设计的作用微乎其微.

1665
来自专栏CDA数据分析师

Python迭代和迭代器详解

一个对象,物理或者虚拟存储的序列。list,tuple,strins,dicttionary,set以及生成器对象都是可迭代的,整型数是不可迭代的。如果你不确定...

2109
来自专栏较真的前端

关于数组的前端面试题,你是否都能答对?

3713
来自专栏java一日一条

10个有关String的面试问题

简单来讲,“==”测试的是两个对象的引用是否相同,而equals()比较的是两个字符串的值是否相等。除非你想检查的是两个字符串是否是同一个对象,否则你应该使用e...

682
来自专栏程序员互动联盟

【编程基础】聊聊C语言-常用运算符

上一篇我们讲了C语言中的基本运算符,他们就像基石一样奠定了我们进行基本算术运算的基础。我们马上将上一篇留得题的答案公布如下: 5/4=1 5.0/4=1.250...

3967
来自专栏Java技术栈

字符串拼接+和concat的区别

+和concat都可以用来拼接字符串,但在使用上有什么区别呢,先来看看这个例子。 public static void main(String[] args) ...

2774
来自专栏风口上的猪的文章

.NET面试题系列[3] - C# 基础知识(1)

重要程度:10/10,身家性命般重要。通常这也是各种招聘工作的第一个要求,即“熟悉C#”的一部分。连这部分都不清楚的人,可以说根本不知道自己每天都在干什么。我们...

1892
来自专栏Java帮帮-微信公众号-技术文章全总结

第五天 方法【悟空教程】

2067

扫码关注云+社区

领取腾讯云代金券