首页 > 代码库 > Linux C 程序 (13)

Linux C 程序 (13)

C语言预处理,结构体

C语言预处理命令
1.宏定义

   1.无参数宏

1    #define 标识符 字符串2            #代表本行是编译预处理命名3            习惯上,宏定义大写4            代替一个字符串,介绍重复书写某个字符串的工作量5            有意义的宏代表无规律的字符串,增强可读性6            范围:宏定义开始到本源程序文件结束,可以使用#undef提前终止作用范围7            宏定义允许嵌套,前面定义了的宏可以被后面的宏使用    

   2.有参数宏

 1    #define 标识符(形参表) 字符串 2 #include<stdio.h> 3 #define  MAX(x, y)   (x > y ? x : y) 4  5 int main (){ 6         int a = 5 , b = 10 , max ; 7         //MAX(a ,b)被宏替代 8         max = MAX(a , b); 9         printf("max=%d",max);10 }11 12             宏名与形参表的圆括号之间不能有空格13             字符串内的形参最好用括号括起来14             #define MUL(x, y) x*y15             c = MUL(a+1,b+1);  ==>  a+1*y+116             应该为(a+1)*(b+1)  17             所以:#define MUL(x,y) (x)*(y)18             有参数的宏的形参不是变量,不分配内存空间,不说明类型参数19             预处理程序认为有参数宏的实参是字符串a+1先去替换x而不是先运算a+1再替换x20             宏替换不会占用运行时间,只是编译时间长一些,而函数调用会占运行时间,一般用宏来代表一些比较简单的表达式。

 


2.文件包含#include

1 文件包含命令是把指定文件全部包含进来,插入到命令所在位置,取代原来的命令行,由当前文件和指定文件组成一个文件,一起编译。2 一个#include只包含一个文件3 #include<>  和 #include ""4 区别查找指定文件的位置不同。5 尖括号只在缺省目录里找文件,缺省目录由用户设置的编程环境所决定。6 双引号先在    源程序文件所在的当前目录找指定文件,没有的话再在缺省目录里找。

 



3.条件编译
对一部份内容指定编译条件。

 1     1.范式一 2     #ifndef 标识符 3     ..... 4     #endif 5     eg: 6     #ifndef _getkey_h 7         #define _getkey_h 8         #include<sys/types.h> 9     #endif10     如果没有定义常量 _getkey_h则定义_getkey_h然后把sys/types.h包含进来11     2.范式二12     #ifndef 标识符13     ...1...14     #else15     ...2...16     #endif17     如果没有定义标识符,编译1,否则编译218     3.范式三19     #ifdef20     ......21     #endif22     定义了标识符,就编译23         eg:#ifdef  DEBUG24                     printf("debug----");25              #endif26         在调试程序的时候在源程序头部加入27         #define DEBUG28         用于调试29         4.范式四30         #ifdef 标识符31         ......32         #else33         ......34         #endif35         5.范式五36         #if 表达式37         ......38         #endif39         表达式成立,编译40         6.范式六41         #if 表达式42         ......43         #else44         ......45         #endif

 




4.结构体和共用体
   1.声明和引用结构体

 1    struct 结构体名 2    {   3        成员列表 4    }; 5    声明结构体也是一个C语言语句,分号来结束,相当于构造了一个新的数据类型 6    struct person 7    { 8        char name[20]; 9        int age;10        char sex;11        char phone[15];12    };13    struct person p1,p2;14    系统为这个person结构体分配的内存为20+4+1+15=40字节15    printf("%d",sizeof(p1));16    如果把char phone[15]改为char phone[16],结果不是41,而是4417    //内存为了提高访问效率有一个规则:4字节对齐18    申明结构体时也可以同时定义变量19    struct person20    {21        char name[20];22        ......23    }p1,p2;24    另一种方式:没有声明结构体名,不能再定义其他结构体25    struct26    {27        char name[20];28        ......29    }p1,p2;

 


   2.引用和初始化结构体变量
 

1  struct person p1;2    strcpy(p1.name,"fubin");3    p1.age=23;4    p1.sex=m;5    strcpy(p1.name,"18573116140");6    printf("%s",p1.name);7    "."是成员运算符,在所有运算符中优先级最高

 


   3.结构体和数组
 

 1  struct person p[2] = {{"f1",21,m,"123456789"},{"f2",22,w,"123456789"}}; 2    eg: 3        #include<stdio.h> 4         #include<string.h> 5 int main(){ 6         struct student { 7                 int number; 8                 char name[20]; 9                 char sex ;10                 int age;11                 char addr[30];12         };13 14         struct student s[3] = {{10000,"zhaang",m,21,"shenzheng"},{10001,"li",w,23,"guangzhou"}};15 16         s[2].number=10002;17         s[2].sex=m;18         s[2].age=23;19         strcpy(s[2].name,"fubin");20         strcpy(s[2].addr,"hunanchangsha");21         int i;22         for(i = 0 ; i < sizeof(s)/sizeof(s[0]) ; i++){23                 printf("%d,%s,%c,%d,%s\n",s[i].number,s[i].name,s[i].sex,s[i].age,s[i].addr);24         }25         return 0;26 }

获得结构体数组的长度的方法:sizeof(s)/sizeof(s[0]);

    4.结构体和指针
    

 1     结构体中的成员是按顺序连续存放在内存中,一个结构体指针指向结构体变量,结构体指针保存的值是它所指向的结构体变量的内存首地址。 2     struct student s1; 3     struct student *p; 4     s1.number=10002; 5     s1.sex=m; 6     s1.age=23; 7     strcpy(s1.name,"fubin"); 8     strcpy(s1.addr,"123124134"); 9     p=&s1;10     printf("%d,%s,%c,%d,%s\n",p->number,p->name,p->sex,p->age,p->addr);11     12     (*p).number  =====  p->number13     一般不用前者14     p->number++ 得到number,使用之后再加115     ++p->number 先加1,再使用

    5。指向结构体数组的指针

 1     eg: 2 #include<stdio.h> 3 #include<string.h> 4 int main(){ 5         struct student { 6                 int number; 7                 char name[20]; 8                 char sex ; 9                 int age;10                 char addr[30];11         };12 13         struct student s[3] = {{1000,"fafa",m,34,"shenz"},{1001,"hioh",w,23,"guangzhou"},{1002,"fe",m,12,"dongguan"}};14 15         struct student *p;16         for(p=s ; p < s+3 ; p++){17                 printf("%d,%s,%c,%d,%s\n",p->number,p->name,p->sex,p->age,p->addr);18         }19 20         return 0;21 22 }


6.结构体指针做函数的参数

 

1 void print_struct(struct student *p){2     p->age++;3     printf("%d,%s,%c,%d,%s\n",p->number,p->name,p->sex,p->age,p->addr);    4 }

 

 




   

Linux C 程序 (13)