C语言学习笔记-知识点随记1

利用scanf给int类型数组赋值数据类型的大小

/*32位系统中*/
//char       1个字节
//short      2个字节
//int        4个字节
//long       4个字节
//long long  8个字节
//float      4个字节

printf使用

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位

利用scanf给int类型数组赋值

int arr[5]={0};
int i;
for(i=0;i<5;i++)
{
    scanf("%d",arr+i)
}//输入过程中以' '(空格)或者回车都可以输入下一个因为scanf中数组以' '结束 

 利用scanf给char类型数组赋值

	char arr[20] = { '0'};
	int b = 0;
	scanf("%s", arr);
	printf("%s", arr);//字符串以空格为结束标志
    //例如输入"abc def" 输出"abc"

const的使用 

修饰普通变量

const修饰变量以后,该变量值不可以改变,但是可通过指针解引用进行重新赋值

修饰指针变量

const int(类型) * p(变量名):        可以改变指针的指向(地址),不能改变指针指向的内容。

int(类型 )* const p(变量名):         可以改变指针指向的内容,不能改变指针的指向(地址)。

const int(类型) * const p(变量名):指针的指向、指针指向的内容都不可以改变。

为了便于理解,当const在*右侧 修饰的是p本身,p本身代表的是一个地址,则地址不可改变;当在*左侧,修饰的是这个变量全体(*p),即地址里面的内容。
 

static的使用 

static主要用于修饰局部变量和函数,static修饰的变量存储在静态区,如果用其修饰全局变量,则全局变量失去外部链接属性,即不可以在别的文件内使用。(不可被extern)

static修饰函数称为静态函数,(1)若其出现在类中,调用此函数不会改变任何非static成员的值;(2)若不是在类中,则此函数只可以在该文件中使用,并且不可以被外部应用(外部可以存在同名函数)。 

栈区:   存储局部变量, 

堆区:   动态内存分配,   

静态区:存储全局变量,静态变量也在静态区。

extern的使用

当一个函数或者全局变量,其具有外部链接属性,因此可以被别的文件使用,当需要在一个和文件使用别的文件的全局变量和函数时候,在要使用的文件开头extern要使用的变量和函数,即可使用。

define的使用

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时候 结构为switch(x) case 1: case 2:...

注意:(1)case后面必须为常量;(2)case后语句如果不加break,将会一直执行下去,直到最后一条(一般为default)

for内部的++i和i++

for内部的++i和i++对于程序逻辑没有任何影响,但是不提供的场景用法不一样,一般情况下++ikeyi 减少程序的运行时间

补充:++i和i++为先+后赋值和先赋值后+的区别具体情况具体分析

break、continue和return

return是返回值,强制结束

break终止整个循环(只能跳出一个)

continue终止本次循环的,开始下一次循环(用于判断条件)

在实际应用中,需要对结构进行设计,可以使用标志位和或使用goto语句等来将程序体跳转到想要到达的位置(不建议使用goto语句)

do while和while

do while是先执行语句,后判断

while是先判断,后执行语句

你可能感兴趣的