关键字,结构体,调制信息

来源:互联网 发布:栅格数据 链式编码 编辑:程序博客网 时间:2024/05/17 01:45

一.关键字


1.register

①register作用:请求编译器尽可能地将变量存在CPU内部寄存器中,省出CPU从内存中抓取数据的时间,提高运行效率。

②register使用:多次被重复使用的变量,循环变量。

③register使用注意事项:1.register只能修饰局部变量,不能修饰全局变量和函数。全局变量可以被多个任务和进程访问,如果当前进程声明register,只有当前进程知道register,其余的无法访问。     2.不能用取地址获取一个register修饰的变量的地址。        3.register修饰的变量的地址一定是CPU支持的,接受的数据类型。

 

2.static

static既可修饰变量,也可以修饰函数。变量又分为局部变量和全局变量,修饰局部变量,延长局部变量的生命周期,使用完以后被释放。修饰全局变量,这个全局变量只在本文件可见,其他文件不可见。修饰函数,只能在本函数中调用,其他函数中不可用。static修饰的变量全部保存在数据区中的静态数据区,没有初始化,系统默认初始化为零。

 

全局变量用起来比较危险

 

使用情况:static修饰只想在本文件(本函数)被使用,不想被其余的文件(函数)被使用。

static是起保护作用。

 

 

 

3.const

 

const修饰一个变量叫只读变量。

const int *p 不能通过p改变指向空间的值。

int *const p不能通过p改变对应空间的地址。

空间还是可变的,但是不能通过修改它的变量名来修改这个空间的值。

使用const注:使用const修饰变量的时候,一定要给const进行初始化。

 

总结:const修饰一个变量叫只读变量,空间还是可变的,但是不能通过修改它的变量名来修改这个空间的值。

 

 

 

4.typedef

作用:给数据类型重起名字。

①提高代码移植性

②把复杂的定义变成简单的变量名,方便定义变量。

③解释某些变量的作用。

 

 

5.extern

extern 外部声明 声明它是在其它文件定义的。

extern  声明时要 标注变量类型(全局变量)。

 

6.volatile

volatile的主要作用是:提示编译器该对象的值有可能在编译器未监测的情况下被改变。 

1.一:告诉compiler不能做任何优化 

2.  表示用volatile定义的变量会在程序外被改变,每次都必须从内存中读取,而不能把他放在cache或寄存器中重复使用。  

 

 

 

二结构体

 

作用:①封装数据

 

name是数组名,stu.name是一个指针常量,不能赋值。

 

结构体变量.成员名

*p.成员名

p->成员名

这三个是等价的,通常为了清晰,都用最后一个。

 

  1#include<stdio.h>

  2 struct student

  3 {

  4     int id;

  5     char name[20];

  6     int age;

  7 };

  8 int main()

  9 {

 10 struct student stu_array[3]=

 11 {

 12     {1,"zhangsan",12},

 13     {2,"lisi",13},

 14     {3,"wangwu",15}

 15 };

 16 int i;

 17 #if 0

 18 for(i = 0; i < 3; i++)

 19 {

 20     scanf("%d",&(stu_array[i].id));

 21     scanf("%d",stu_array[i].name);

 22     scanf("%d",&(stu_array[i].age));

 23 }

 24

 25 #endif

 26 for(i = 0; i < 3; i++)

 27 {

 28     printf("%d\n",stu_array[i].id);

 29     printf("%s\n",stu_array[i].name);

        printf("%d\n",stu_array[i].age);

 31 }

 32     return 0;

 33 }

 

2.字对齐&半字对齐

char ch

short num

char ch2

char ch1

6

 

char ch

char ch2

short num

int num2

char ch1

12

 

int num[3];

char ch[5];

char *ptr;

double i;

struct student *str;

36

 

3.内存空洞

函数返回多个值1.传出参数

               2.结构体

 

4.Union公用体,长度为里面最长的长度。

 

5.大端字节序&小端字节序

int num = 0x12345678   1:高字节    2:低字节

 

小端字节序:低字节存放在低地址对应的空间,高字节存放在高地址对应的空间。

大端字节序:高字节存放在低地址对应的空间,低字节存放在高地址对应的空间。


 

判断是高地址还是低地址:

#include<stdio.h>

union str

{

    

    int num;

    char ch;

};

 

int main()

{

    union str str;

    str.num = 1;

    str.ch = 0;

    if(str.ch = 1)

    {

        printf("big!\n");

    }

    else

    {

        printf("small!\n");

    }

    return 0;

}

 

 

 

6.enum

enum提高代码可读性。

宏定义和枚举的区别:

1.宏定义,宏定义只是在程序的开头定义了一个字符常量,它并不分配内存空间,所以根本不占用内存,它只是在程序预编译的时候,给常量赋一个固定的值,当程序中遇到这个字符常量时就会知道它就是预编译时被赋的那个值,代入运算就可以了,这个值在程序中是不能被改变的,只有在宏定义中才能改变,改变了之后,程序中所以出现此常量的地方都会改变,所以这就给写程序带来了方便,同时也使得程序的可读性更好!!
2.枚举常量是要占用内存的,它要在内存中开辟一个空间来存放枚举变量;其常量值在没有赋值时系统会默认给它的第一个变量赋值0,后面的依次为12......使用枚举类型的最大好处是使得程序可读性增强!!

7.自定义函数和宏函数的区别,优缺点

#define MAXaba>bab

(宏函数,函数式宏定义)

自定义函数和宏函数的区别,优缺点:

优:省去了分配和释放栈,桢,传参返回值等一系列工作,执行下咯率快,空间分配释放。

缺:工作不做语法检查只做替换,不能用于复杂函数。

                                               

 

用编译时间换内存空间:例子:宏函数

用内存空间换运行(执行)时间:内嵌函数

 

_ _LINE_ _内置函数

_ _func_ _所在函数名

_ _TIME_ _显示时间

_ _DATE_ _显示日期

 

 

三.调制信息

做项目的调制信息用debug_msg

Makefile管理

 

 

#ifndef MAX

printfhello world\n

#else

、、、、

#endif

 

 

-D+宏名

#if 0/1

 

 

#endif

 

 

防止头文件重复包含带来重复定义。

#ifndef  A_H

#define  A_H

 

要注意避免幻数。

while1

for(;1;)两个死循环。 

0 0
原创粉丝点击