邂逅C
c的特色是指针和结构体,没有看书就做了几个题,发现哇塞跟我想的都不一样。原来c就是这个样子的啊~,挺有意思的,尤其是指针,提高了运算速度,简化代码!
逐步了解
基本语法的理解
已知:float x, *y=&a; D: printf("%f",y)是错误的;
A:scanf("%f",&x) B: scanf("%f",y)
C: printf("%f",x) D: printf("%f",y)
Why??
scanf(“%f”,&x) 前者%x指输入的类型,后者必须是一个地址;
printf(“%f”,x) 前者表示输出的类型,后者表示输出的值,不能是地址,故D不对。
加加问题是传值还是传引用
两个有趣的问题,同样的知识点,问什么答案不同?
1. int x = 3, y=0, 执行语句 x=!x&&x<++y后,x,y的值正确的是 A
A: x=0, y=0 B: x=3,y=0
C: x=0,y=1 D: x=3,y=1
2.x=1, 则表达式的值“++x+x++”为 C
A: 2 B:3 C:4 D:6
第一题中y++后已是1,可y的值还是0,根本就没变;
第二题中 ++X为2,那x++是1还是2?,x++是先运算后加加,答案是4,所以x++的起始值是2;
为什么第一题中Y++后没有改变y值,而第二题中x++后,X就变了呢?为什么?
经过我合理的揣测,真相只有一个:x++,++x是传值,不是传引用。程序运行过程中,x的值是累计的,程序结束后x的值不变。x=x0; 执行一个程序,期间x=x1, 之后再用到x, x的值是x1; 但是程序结束后x的值还是x0。
*p++和(*p)++的区别
定义的时候*p表示定义了一个指针变量p;
在运算的时候,p表示地址,而*p表示地址上的值;
* 和 ++是同优先级的,而且都是从右向左结合的。
p++,先算p++,就是现在p的地址加了1,p=a+1,p之前指向a的首地址,现在地址加了1;然后算,因为p++是先运算后加加,所以*p取得值是a[0]的值;
(*q)++, 先算括号里的,*q=a[0],然后让a[0]+1,p指向的地址没有变即还是a的首地址。
运算符
用十进制表示,表达式0x12&12的值为 A
A:0 B:24 C:1 D:6
其中0x表示16进制, & 表示按位与。
&(按位与): (0,0),(0,1)(1,0)=0; (1,1)=1
即都是真才是真,通俗点:与嘛,你有我有全都有
^(异或): (1,0),(0,1)=1; (0,0),(1,1)=0
即异的才是真的,通俗讲就是:充分发扬不求最好,但求另类的精神
C 中幂运算怎么表示
a的3次方,两种方法:
1. a*a*a (不能用^,^被异或拐跑了)
2. pow(a,3)表示a的3次方,但需要引入math.h头文件
指针数组傻傻分不清楚
1.int(*p)[4]————指向数组的指针,数组的首地址,该数组包含4个整型数据。
2.int*p[4]————指针数组,有4个整型数据的指针组成。
fopen认识只读,只写,读写
fopen函数调用格式:fopen("文件名","使用文件方式")
r: 以只读方式打开文件,该文件必须存在;
r+: 以可读写方式打开文件,该文件必须存在;
rb+: 读写打开一个二进制文件,该文件必须存在;
-------------------------------------------------------------------
w: 打开只写文件,若文件存在则文件长度清为0,即文件内容会消失。若文件不存在则建立该文件;
w+: 打开可读写文件,若文件存在则文件长度清为0,即文件内容会消失。若文件不存在则建立该文件;
wb: 只写打开或新建一个二进制文件,只允许写数据;
wb+: 读写打开或建立一个二进制文件,允许读写;
-------------------------------------------------------------------
a: 以附加的方式打开只写文件。若文件不错在,则会建立该文件,若存在,写入的数据会被加到文件尾,即文件原来的内容会被保留。
a+: 以附加方式打开可读写文件。若文件不错在,则会建立该文件,若存在,写入的数据会被加到文件尾,即文件原来的内容会被保留。
ab+: 读写打开一个二进制文件,允许读或在文件末尾追加数据。
欲为好朋友
以上是对c一个初步的浅显的认识,许多细碎的点,还是要回归课本,了解一些原理。考研的程序设计题真的是,不准备肯定不行,所以乖乖练习吧。