C与指针——与谭浩强不同的C

闲来无事,看看《C与指针》。

如果有人告诉你,马里奥可以用c写出个矩阵的相撞的判断,你也可以写出自己的马里奥的时候,动力就来了。

其实C可以这样写的!

C混乱编码大赛作品,美国 Don Yang(感觉就是个动漫宅)。

(一)C是自由形式的语言,比较好的编码规范就是:

two = one + one ;

其实下面那样自由也是可以的,所以,那个头像不奇怪,你也可以:

two
=
one +
one

所以下面也是一样:

int* a;  int *a;

(二)三字母词

int main(int argc, char *argv[])
{
	printf("Hello ??(:");
	return 0;
}

你觉得他会显示出一张哭脸吗,不,看,变脸:

Hello [:请按任意键继续. . .

这就是三字母词(trigrph),??( 合起来表示 [ 。

谭浩强老师的书把没编过程序的我带进了编程的世界,打基础的话算很好了,不过后面回来看看,确实有不足的地方。

其实程序出现的很多int a,b,i,j。问题就存在与变量名的随意,导致以后代码重看的时候忘掉变量是干什么用的,所以命名要注意。不过书作为例子示范,没必要讲究那么多。

(三)+=和=

int number;
number = number +1;
number += 1;

两个的效率基本相同。

int number;
while(1)
  number++,
  number++;

但是,遇到

number[3f(x)]=number[3f(x)]+1;
number[3f(x)]+=1;

就有区别了,编译器是不知道f(x)的结果的,也不知道每次的结果是不是相同,所以他会计算两次,这样+=就比计算两次的f(x)高效。

(四), 的妙用

int number;
while(1)
  number++,
  number++;

不用{},但是不推荐使用,因为难分辨,还是要有良好的编码风格。

(五)左值右值问题

所谓的L-value和R-value,L=R,不过l也可以指location,可寻址值,r指read,可读值。

a = b + 1;

b+1是一个值,a有特定的存放地址,可以赋值。但是

b + 1 = 1;

b+1作为可确定的一个值,会存储在一个地方,但是未知,计算机不允许你把值放到一个你未知的地方。

(六)指针

计算机里,每个字节(byte)有8位(bit),一个位就是0和1。

int a = 1;
int *b = &a;

假如a的地址为100,那么&a就是取a的地址。

而第二条语句其实也可以这样赋值:

int *b ;
b = &a;

b是指向整形的指针变量,将a的地址赋给b,则b存储的是a的地址,*b就是a地址所指向的值,即1。了解这个之后,后面都容易理解。

*(b+1)

指的是b指针后的下一个值。

int a;
*&a = 1;
a = 1;

第三条语句和第二条语句相同吗?是的,相同,只不过第二条书写麻烦。

&a,a的地址,*&a,a的地址所指向的值为1,也就是a的值为1。

#include <stdio.h>

int main(int argc, char *argv[])
{
	int c[5] = {1,2,3,4,8};
	int *d = &c[4];
	int *e = &c[1];
	int f = &c[4];
	int g = &c[1];
	printf("%d\n",&c[4]);
	printf("%d\n",&c[1]);
	printf("%d\n",*d);
	printf("%d\n",*e);
	printf("%d\n",d-e);
	printf("%d\n",&c[4]-&c[1]);
	printf("%d\n",f-g);
	printf("%d\n",c[4]-c[1]);
	return 0;
}

运行结果:

1245000
1244988
8
2
3
3
12
6
请按任意键继续. . .

指针和指针的相减需要两个指针指向同一个数组,其实&c[n]就是一个指针,两个指针相减的结果是两个指针的内存距离除以数组类型的长度,其实就是下标之间的差值。而整型的强制转换之后,就变成了两个整数的差值了,和指针相减没有关系。

++与指针

*cp++  //++优先级高于*,cp指针的拷贝指向的值,cp下次的时候指向下一个
*++cp  //指向cp下一个指针的拷贝所指向的值。

(七)动态内存分配,数据结构等等。

先弄清楚C内存分配的部分。栈(编译器自动分配释放,存放函数参数值,局部变量值),堆(由自己分配释放),全局区,文字常量区,程序代码区。

为什么数据结构里都用malloc,就是因为自己想分配多少就多少,掌控空间大小,比较自由。 搞懂这个和指针,数据结构就好办。

(八)预处理器

define的作用可以将文本替换到程序里。

所谓的宏,define允许把参数替换到文本中,如:

#define double(x)  x*x
int a = 1;
printf("%d",double(a+1));

double会替换成上面的表达式,但是这里的结果会有问题,因为根据参数代入,那么会等于a+1*a+1,看出来没有,结果不是我们想要的。所以,应该在表达式上加入括号。

还有一个好用的地方。

#define MAX(a,b)  ((a)>(b)?(a):(b))

没有类型限制,因为宏是替换的,相当于把代码全部插进去,如果宏比较简单,那还是高效的。

(九)输入输出流

讲一下EOF这东西,之前没见过。

http://blog.csdn.net/ltx19860420/article/details/5526828

转一篇,其实以前在写getchar和putchar的时候烨觉得很奇怪,为什么不是我们输一个字符打印一个字符,非要回车一下它才显示。

(十)标准函数库

stdlib.h 里面是有随机数函数的 int rand( void );

也有数学函数的调用库:math.h,

时间函数:time.h。

具体的就不详述了。

原来谭浩强的c当启蒙书还是挺好的,C与指针就是加强版。

C与指针——与谭浩强不同的C,布布扣,bubuko.com

时间: 2024-10-12 02:31:28

C与指针——与谭浩强不同的C的相关文章

关于c语言学习 谭浩强的书

2007-11-16 13:22:58|  分类: PROGRAMME |  标签: |举报 |字号大中小 订阅 广大有志于从事IT行业的同志们,在你们进入这一行之前千万请看这篇文章!太经典了!对你绝对有启发! 千万别买谭浩强和等级考试的书!!!!!! 整理别人的言论,请大家踊跃讨论!!!!!!!!!!!! 1:书皮上面有那么多的牛人题词,估计也许是自己的水平太低. 2:ANSI只给了两种方式:int main(void) {/*...*/}和 int main(int argc, char *

[C程序设计(第四版)].谭浩强.扫描版pdf

下载地址:网盘下载 内容简介 <中国高等院校计算机基础教育课程体系规划教材:C程序设计(第4版)>是一本公认的学习C语言程序设计的经典教材.根据C语言的发展和计算机教学的需要,作者在<C程序设计(第三版)>的基础上进行了修订.<中国高等院校计算机基础教育课程体系规划教材:C程序设计(第4版)>按照C语言的新标准C99进行介绍,所有程序都符合C99的规定,使编写程序更加规范:对C语言和程序设计的基本概念和要点讲解透彻,全面而深入:按照作者提出的"提出问题-解决问

读谭浩强C语言数据结构有感(1)

1.什么是数据结构? 数据结构,就是我们计算机内部的运算,编程语言的基础工作模式吧,个人总结的 = = !! 数据:说简单一点,就是计算机二进制机器码,然后通过一些复杂的操作,变为复杂的语言. 数据元素:数据有集合和元素的区别,集合里的个体就是数据元素,相对应的就是数据结构. 线性表: 说简单一点,就是线性存储结构,每个表中有大量的元素,这些元素在物理位置中都是连接起来的. 这些元素有直接前驱和直接后继.线性表的位置是相邻的. 比如,位置1,位置2,位置3......位置N. 还有一点,线性表的

C语言学习笔记---谭浩强

前段时间有机会去面试了一次,真是备受“打击”(其实是启发),总的来说就是让我意识到了学习工具和学习技术的区别.所以最近在看一些数据结构和算法,操作系统,python中的并行编程与异步编程等东西.然而数据结构那些本来是在看python下的,但是python实在包装了太多的东西而大多的经典教材都是基于C语言的(自然是这样,C语言能够操作直接访问物理地址,能够进行位(bit)操作的特点就决定了.)所以就决定重新学一遍C语言,先重温下谭浩强老师的书籍记录下要点: 一:语言: 机器语言:计算机直接识别和接

[转载]谭浩强育人

原文地址:http://www.liuren.com/liuren/hero/chenxuyuan/9.htm 谭浩强育人 谭浩强,著名计算机教育专家. 1934年生,广东台山人.1958年清华大学自动控制系毕业. 现任全国高等院校计算机基础教育研究会理事长.教育部全国计算机应用技术证书考试 委员会主任委员.教育部全国计算机等级考试委员会副主任.中国计算机学会教育委员会副 主任等多项职务. 处女作<BASIC语言>一书发行量超过1200万册,获国家科技进步奖.在中央电视台主讲的7种计算机语

千万别看谭浩强的书!!!!

广大有志于从事IT行业的同志们,在你们进入这一行之前千万请看这篇文章!太经典了!对你绝对有启发! 千万别买谭浩强和等级考试的书!!!!!! 整理别人的言论,请大家踊跃讨论!!!!!!!!!!!! 1:书皮上面有那么多的牛人题词,估计也许是自己的水平太低. 2:ANSI只给了两种方式:int main(void) {/*...*/}和 int main(int argc, char *argv[]){/*...*/}其它的形式都是不标准的,属未定义行为,老潭就好这个. 3: 如果你有兴趣,不妨查查

【c语言】c程序设计--谭浩强--(第一章)

闲来无事把谭浩强的书里边的题敲了一遍,,纪念一哈,,纯手工 // 在屏幕上输出 This is a c program. #include <stdio.h> int main() { printf("This is a c program.\n"); return 0; } // 求两个整数之和 #include <stdio.h> int main() { int a,b,c; printf("请输入两个整数:\n"); scanf(&q

为什么很多人吐槽谭浩强的C语言程序设计?

这个观点在网络上已经论战了很长时间,出现这种情况还是历史遗留问题,老谭出的C语言教材几乎是国内的第一版,由于中英翻译问题或者对编程文化理解的差异性导致出来的书多多少少存在一些纰漏.不能只是记住其缺点,老谭书最主要在那个年代起到了普及C语言的作用,这已经足够了,如同做一个产品,首先解决的是有没有问题,最后才是细节完善阶段.最后,如果大家如果在自学遇到困难,想找一个C++的学习环境,可以加入我们的C++学习圈,点击我加入吧,会节约很多时间,减少很多在学习中遇到的难题. 为什么很多人吐槽谭浩强的C语言

c++面向对象程序设计 谭浩强 第一章答案

c++面向对象程序设计 谭浩强 答案 第一章 第1章  C++?的初步知识 1.请根据你的了解,叙述C++?的特点.C++?对C有哪些发展? [解] 略. 2.一个C++的程序是由哪几部分构成的?其中的每一部分起什么作用? [解] 略. 3.从拿到一个任务到得到最终结果,一般要经过几个步骤? [解] 略. 4.请说明编辑.编译.连接的作用.在编译后得到的目标文件为什么不能直接运行? [解] 编译是以源程序文件为单位进行的,而一个完整的程序可能包含若干个程序文件,在分别对它们编译之后,得到若干个目