C语言重温--基础篇
一、基础内容
转换关系
8bit=1byte(字节)
1024byte=1kb
1024kb=1mb
1024mb=1gb
1024gb=1tb
1.名称定义:
- 有意义的变量名
- 字符有小写字母,大写字母,数字 下划线
2.数据类型
Type | Size |
---|---|
char, unsigned char, signed char | 1byte |
short, unsigned short | 2bytes |
int, unsigned int long, unsigned long float | 4bytes |
double long double | 8bytes |
具体数值及输入输出指令
- char:字符型 8【赋值方式:char grade = ‘A’; 】
- int :整形 32
- float:浮点数 32
- double:双精度 64
- PS:输入 出符的用处
eg:
#include<stdio.h>
int main()
{
char num;
num=150;
printf("out-d is %d,out-c is %c.\n",num,num);
return 0;
}
由结果可知,输出形式对数值的表达是有区别的,double输出–溢出后算负数(由输入类型决定了),c输出-显示asll码。【输入输出符号只影响表达,不影响其本身的数值】
- 常用输入输出符号及含义
符号 | 含义 |
---|---|
%d | 十进制双精度 |
%o (字母 o) | 八进制 |
%x | 十六进制 |
%f | 浮点输出 |
%c | ASCLL码输出 |
%u | unsigned int类型的值 |
%s | 字符串 |
备注 | 显示 0 或0x前缀,必项在说明符中加入#符号。 |
3.常用函数
- scanf("%d",&变量); scanf("%d",数组);printf("%d",变量)
- scanf的注记
scanf返回值(数字返回1,其他返回0)-利用这个性质可以做while循环的标志
status = scanf("%ld",&num);
while (status == 1)
{
/* loop actions */
status = scanf("%ld",&num);
}
- sizeof(变量):
求某类型或某变量类型的字节数(debug用) - strlen():(返回字符串长度)
4.Debug基本方法
- 在程序的几个关键点处加入 printf()监视变量的值。
- 打断点
- 使用调试器逐步调试
5.编程小贴士
- 常量处理:
- 预处理器
#define TAXRATE 0.015
最好培养大写习惯#define BEEP '\a' 定义符号
#define OOPS "Now you have done it !" 定义字符串
- const 修饰符
const int MONTHS = 12; // MONTHS 是一个今表 12的符号常量
只能读 - 枚举(enum)枚举说明
二、重点学习内容
- 说明:本次复习参考书目未 c primer plus
- 由于全文扫荡效率低下,故将目录的黄色标识部分优先回顾,红色部分涉及文件操作,用于嵌入式开发,先放放。
- 下文将按照重点内容展开笔记
1.字符串的输入输出
2.运算符 表达式 语句
[1] while()循环
[2] 运算符 (=,+,-,*,/,% )
- 关系运算符(< ,>,==,!=)癿优先级要低亍包括 + - 在内的算术运算符,但是要高于赋值运算符。
[3] typedef(给类型起一个别名)·
typedef double real;
使 real 为成 double 癿删名。现在你可仌声明一个 real 类垄癿发量
3.循环
- while()–循环
- 妙用
结合空语句做判断
while (scanf("%d",&num)== 1)//分号做空语句
; /* 跳过整数输入 */
计数器原则:初始化 比较 增
int NUMBER=20;
while(counf++ <== NUMBER ) 语句 ;
2.for–循环(集三要素于一体)
4.数组
初始化方式
1.const char buf[]={'o','k','b','b',1};
2.const char num[]="ws is handsome";//仅限字符串
打印方式
for(i=0;i<sizeof(num)/sizeof(num[0]);i++)
printf("%c",num[i]);
5.指针
- 理解:指针就像磁盘的磁针,直接指向地址
- 用法:
//定义 -- 联系数组
int data[2] = {100,200};
int moredata[2] = {500,400}; //连续存放,上一个数组移位移溢出后就会取下个数组的值
int *p1;
p1 = data;
//调用
int num,adr;
num = *p1;//取数据--输出:100
adr = p1; //取地址--输出:4206608(不同PC不同)
//复合操作--* ++同级操作符 作用顺寻从右到左
printf("p1的地址是 %d,P1的值是 %d \n",p1,*p1);
printf("地址自加 p1输出值 = %d, 地址自加 p1输出值= %d, p1取值后输出 再+1 = %d , p1取值后+1 在输出= %d \n",
*p1++ , *++p1, (*p1)++ ,++(*p1));
printf("p1的地址是 %d,P1的值是 %d",p1,*p1);
//输出结果
p1的地址是 4206608,P1的值是 100
地址自加 p1输出值 = 200, 地址自加 p1输出值= 200, p1取值后输出 再+1 = 101 , p1取值后+1 在输出= 101
p1的地址是 4206616,P1的值是 500
//分析:
1.同行操作不影响
2.但是上一行的所有操作会全部影响到下一行,比如指针位移了两次+8字节
3.建议带括号操作,这样不容易出错,也易懂
- 其他操作
- 指针自加 自减
- 指针加 减一个整数位移
- 指针减指针
- 取指针的地址(&)
//定义
int urn[5] = {100,200,300,400,500};
int *ptr1, *ptr2, *ptr3,*adr,num;
ptr1 = urn; //把地址赋值给指针
ptr2 = &urn[2]; //数组第一个数值才是地址,其他的需要取出地址
//ptr+4 的结果等同 &urn[2]。
1.
ptr1++; //一次加4个字节 一个int位
ptr1--;//相当于不变
2.
ptr3 = ptr1 + 4; //移动16字节 地址+16 adr
adr = ptr3-2;
3.
num = ptr3-ptr1;//num=4
4.
printf (" &ptr1 = %p \n",&ptr1);//输出地址的地