/*32位系统中*/
//char 1个字节
//short 2个字节
//int 4个字节
//long 4个字节
//long long 8个字节
//float 4个字节
int a=0;
char b=48; //or float='0';
long c=0;
flaot d=3.14159f; //表示float类型的浮点数时建议带上f,double类型不用带。
double e=3.14159;
printf("%4d",a); //输出四位宽度的数据右对齐 |___0
printf("%-4d",a); //输出四位宽度的数据左对齐 |0___
printf("%04d",a); //输出四位宽度的数据右对齐,缺位补0 |0000
printf("%-04d",a); //输出四位宽度的数据左对齐,缺位补0 |0000
printf("%4.2f",d); //输出四位宽度的数据右对齐,小数点两位|_3.14
printf("%p",&a); //打印a的地址,为随机值
printf("%x",a); //打印十六进制
printf("%o",a); //打印八进制
//float 有效数字位为 6 – 7位,字节数为4,指数长度为 8位,小数长度为23位
//double有效数字位为15 – 16位,字节数为8,指数长度为11位,小数长度为52位
int arr[5]={0};
int i;
for(i=0;i<5;i++)
{
scanf("%d",arr+i)
}//输入过程中以' '(空格)或者回车都可以输入下一个因为scanf中数组以' '结束
char arr[20] = { '0'};
int b = 0;
scanf("%s", arr);
printf("%s", arr);//字符串以空格为结束标志
//例如输入"abc def" 输出"abc"
const修饰变量以后,该变量值不可以改变,但是可通过指针解引用进行重新赋值
const int(类型) * p(变量名): 可以改变指针的指向(地址),不能改变指针指向的内容。
int(类型 )* const p(变量名): 可以改变指针指向的内容,不能改变指针的指向(地址)。
const int(类型) * const p(变量名):指针的指向、指针指向的内容都不可以改变。
为了便于理解,当const在*右侧 修饰的是p本身,p本身代表的是一个地址,则地址不可改变;当在*左侧,修饰的是这个变量全体(*p),即地址里面的内容。
static主要用于修饰局部变量和函数,static修饰的变量存储在静态区,如果用其修饰全局变量,则全局变量失去外部链接属性,即不可以在别的文件内使用。(不可被extern)
static修饰函数称为静态函数,(1)若其出现在类中,调用此函数不会改变任何非static成员的值;(2)若不是在类中,则此函数只可以在该文件中使用,并且不可以被外部应用(外部可以存在同名函数)。
栈区: 存储局部变量,
堆区: 动态内存分配,
静态区:存储全局变量,静态变量也在静态区。
当一个函数或者全局变量,其具有外部链接属性,因此可以被别的文件使用,当需要在一个和文件使用别的文件的全局变量和函数时候,在要使用的文件开头extern要使用的变量和函数,即可使用。
extern和static都是用于修饰变量,如果需要定义一个不可变的常量,需要用的宏定义#define,定义的宏定义的名称一般默认为全大写,宏定义一般只在该文件可用。
在一个文件内定义一个函数,在现行标准下一般不需要声明,最好写在main函数前面,函数之间留一个空行,如果需要在别的文件使用 ,需要外部连接属性,但是由于头文件默认函数都具有外部连接属性,因此可以省略
int * p=0;可以定一个指针变量,需要理解的是指针变量为 p 而不是 *p
指针变量的长度在32位机器都是4字节
数组的名称即为数组的首地址 eg:arr[5] arr就是一个地址 不需要额外加上取地址符&,同时arr[1]等同于arr+1,arr[2]等同于arr+2......因此如果函数定义数组形参的话,可以定义为int *arr 即可在函数里使用数组。
一个内存单元是1字节(byte)=8位(bit)数组首地址加1默认为地址加上了4,而不是地址数值+1
每次程序运行,都会给参数赋一个新的地址,这个地址在程序结束时候重新分配
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};
enum DAY DAY1;//DAY为枚举类型 day为枚举变量
还可以定义为
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
}day;
或者
enum
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
}day;
DAY里面的成员是默认从0开始,可以通过给第一个成员赋值来改变(如上述代码)。
若从中间开始改变可以:
enum test {test1, test2=3, test3, test4=6};//test1=0 test2=3 test3=4 test4=6
若枚举成员连续,可以遍历,若不存在,则不可以。
结构体可以同事对一个对象赋予多种参数,eg:
struct stu{
char *name;//字符串开始首地址
long id;
int age;
char sex;
int score;
}stu1,stu2;//必须加; stu为结构体类型,stu1和stu2为结构体变量
stu1.name = "Yun";
stu1.num = 150212;
stu1.age = 24;
stu1.sex = 'M';
stu1.score = 136.5;
struct stu{
char *name;//字符串开始首地址
long id;
int age;
char sex;
int score;
}stu1,stu2;//必须加; stu为结构体类型,stu1和stu2为结构体变量
struct stu *p = 0;//struct stu *p = NULL;
(*p).name = "Yun";
(*p).num = 150212;
(*p).age = 24;
(*p).sex = 'M';
(*p).score = 136.5;
//或为下述类型
p->name = "Yun";
p->num = 150212;
p->age = 24;
p->sex = 'M';
p->score = 136.5;
struct Birth{
int year;
int month;
int day;
}
struct stu{
struct Birth birthday;
}tom;
tom.birthday.year = 1997;
tom.birthday.month = 3;
tom.birthday.day = 22;
使用switch时候 结构为switch(x) case 1: case 2:...
注意:(1)case后面必须为常量;(2)case后语句如果不加break,将会一直执行下去,直到最后一条(一般为default)
for内部的++i和i++对于程序逻辑没有任何影响,但是不提供的场景用法不一样,一般情况下++ikeyi 减少程序的运行时间
补充:++i和i++为先+后赋值和先赋值后+的区别具体情况具体分析
return是返回值,强制结束
break终止整个循环(只能跳出一个)
continue终止本次循环的,开始下一次循环(用于判断条件)
在实际应用中,需要对结构进行设计,可以使用标志位和或使用goto语句等来将程序体跳转到想要到达的位置(不建议使用goto语句)
do while是先执行语句,后判断
while是先判断,后执行语句