首页 > 代码库 > 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)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。