1.进制转化
2.字节及原补反码
3.常量
4.运算符的多层含义
5.指针理解
6.错题积累
7.基础算法
一.进制转化
1.各进制转为十进制:加权法
2.十进制转为其他进制:逆序除以该进制
3.八、十六进制转化为二进制: 写为2^n 按八进制和十六进制各自特殊符号,其中注意的是八进制三位,十六进制四位。
二.字节及原补反码
1.bit 代表二进制的一位数字 是计算机存储数据的方式
2.Byte 1Byte=8bit 一个字节常表示一个字符或是一个数字
**特别注意的是字节通常简写为“B”,而位通常简写为小写“b”
3.1kb=2^10 b (因为1024与1000最接近 故用1024来近似计算)
4.原码 补码 反码:
原码即为该数的二进制表示由于有符号区别 在8位中首位用来表示正负,即0代表正,1为负。
正数的反码即为原码,负数的反码除符号位不变,其余均相反。
补码是各数的反码加一
三.常量
1.’ \n’代表一个字符,“\n”代表一个字符串
2.类型字节数:char 1 short 2 int 4 long long int 8
float 4 (6位有效字符) double 8 (15位有效字符)
四.运算符理解
运算符总的来说包括:符号 参数 运算规则 返回值
1.[ ] (1)开辟数组空间
(2)代表二元运算符 例如a[b] (返回*(a+b))a为地址b偏移量
给多维数组赋值最好采用a[2][2]={{0},{0}};
2.*(1)乘法运算符
(2)声明指针变量
(3)间接运算符取地址量
(2)(3)区别在于运算元数不同
五.指针理解
1.对于指针变量 *p需先有指向地址,才可以进行赋值
2.注意地址符的书写&
3.指针变量初始化和赋值
int *p=&ch;
int *p;
p=&ch;
这两种效果相同
4.对于**p的理解:
可以看成*(*p)即声明一个指针变量 变量名为(*p) 即p为地址
5.注意++*p和 *++p
++*p=*p+1
++p=(p+1)
6.复杂类型与指针结合
*通常有两种命名方式(1)(p).a (2)p->a
指向自身的结构体例子:
struct tag_3{
int value;
struct tag_3 *link;
};
typedef struct tag_3 NODE;
或者
struct tag_2;
typedef struct tag_2 NODE;
struct tag_2{
int value;
NODE *link;
};
六.错题积累
1.结构体数组定义`
struct person class[10]
2.结构体类型名
typedef struct S
{
int g;
char h;
}T;
可用T定义结构体变量
3.函数调用与定义数组的区别
调用sort(str);
定义sort (str[n])(数组和地址定义函数传参时都需这样)
注意此处数组区别
4.a[]={010}
此题易错需注意010=0所以可以这样赋初值
5.for(A; ;B)
此处空为1,即为真就会执行
6.字符串读和赋值需注意‘\0’来结尾
七.基础算法
#include<stdio.h>
max (int a,int b)
{
return a>b?a:b;
}
sushu(int n)
{
if(n<=1) return 0;
for(int i=0;i*i<n;i++)
if(n%i==0) return 1;
else return 0;
}
gcd(int m,int n)
{
int min=(m>n?n:m);
for(int i=n;i>0;i--)
if(m%i==0&&n%i==0) return 1;
else return 0;
}
vcd(int a,int b)
{
return b?vcd(b,a%b):a;
}
Icm(int a,int b)
{
return a*b/vcd(a,b);
}
cal(int n)
{
return n<=1?1:n*cal(n-1);
}
fib(int n)
{
return n<=2?1:fib(n-1)+fib(n-2);
}
main()
{
int a=3,b=5,c=6,d=8;
printf("%d\n%d\n",max(max(a,b),max(c,d)),Icm(c,d));
}
此处包括比大小 素数 最大公约数(辗转相除法) 最大公倍数 阶乘
斐波那契数列