标签:style blog http color 使用 数据 io 2014
闲来无事,看看《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 请按任意键继续. . .
++与指针
*cp++ //++优先级高于*,cp指针的拷贝指向的值,cp下次的时候指向下一个 *++cp //指向cp下一个指针的拷贝所指向的值。
#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))没有类型限制,因为宏是替换的,相当于把代码全部插进去,如果宏比较简单,那还是高效的。
标签:style blog http color 使用 数据 io 2014
原文地址:http://blog.csdn.net/iaiti/article/details/37572703