①封装数据
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,后面的依次为1、2......使用枚举类型的最大好处是使得程序可读性增强!!
7.自定义函数和宏函数的区别,优缺点
#define MAX(a,b)a>b?a:b
(宏函数,函数式宏定义)
自定义函数和宏函数的区别,优缺点:
优:省去了分配和释放栈,桢,传参返回值等一系列工作,执行下咯率快,空间分配释放。
缺:工作不做语法检查只做替换,不能用于复杂函数。
用编译时间换内存空间:例子:宏函数
用内存空间换运行(执行)时间:内嵌函数
_ _LINE_ _内置函数
_ _func_ _所在函数名
_ _TIME_ _显示时间
_ _DATE_ _显示日期
三.调制信息
做项目的调制信息用debug_msg
用Makefile管理
#ifndef MAX
printf(“hello world!\n”)
#else
、、、、
#endif
-D+宏名
#if 0/1
#endif
防止头文件重复包含带来重复定义。
#ifndef A_H
#define A_H
要注意避免幻数。
while(1)
for(;1;)两个死循环。