如何精通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');

}

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

;

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

其次,掌握原理。

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

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

以操作符为例:

++操作符: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语言么?

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

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

关于柚子编程

致力于零基础入阶编程世界,一周一更

每周日中午12:00准时更新

喜欢记得来一个

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180225G0DVIK00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券