------------------------------day--7--内存管理---------------------------------------
系统内核:留给系统的正常运行必不可少的
栈:编写的程序运行时存放变量的
堆:
数据段:存放全局变量,常量的
代码段:存放编译好的代码
2,函数指针:
int quadrate(int a);
// main中
int a=3;
int (*pquadrate)(int a);
pquadrate = &quadrate;
// main中
int a=3;
int (*pquadrate)(int a);
pquadrate = &quadrate;
//必须加上“()”才会是指向一个函数的指针!!!
int s = (*pquadrate) (a);
//最后就相当
int s = (*pquadrate) (a);
//最后就相当
//int s = quardrate(a);
------------------------------day--8--数组声明和内存排序---------------------------------------
1,x/nd:0x7fffffffde1c
x:为要打印输出的内存地址
n:要打印输出几个内存的值
d:按十进制显示
int arr[10];
int p=arr;
其中arr为指针常量
*p为指针变量
------------------------------day--9--预处理宏函数和typedef---------------------------------------
.c文件-->.i文件-->.s文件-->.o文件-->可执行文件
预处理 编译 汇编 链接
1,预处理:
//生成预处理文件
gcc -o hello.i hello.c -E
2,宏定义:
#define R 10
//编译的时候把R替换为10
3,宏函数:
代码实例:
#include<stdio.h>
#define R 20
#define M int main(
#define N(n) n*10
#define ADD(a,b) a+b
//define ADD(a,b) (a+b)
int add (int a,int b){
return a+b;
}
typedef int tni;
//把int * 替换为p
typedef int *p;
//相当于 int *q = NULL;
p q = NULL;
M){
int a=R;
printf("a=%d\n",a);
printf("helloworld\n");
int b= N(a);//int b= a*10;
printf("b=%d\n",b);
int c=add(a,b);
printf("c=%d\n",c);
int d=ADD(a,b);
printf("d=%d",d);
//int e = a+b*a+b;
int e = ADD(a,b)*ADD(a,b);
printf("e=%d",d);
return 0;
}
输出结果:
a=20
helloworld
b=220
c=220
e=4220
宏不考虑C语言语法,只做替换功能
另外一个实例:
#include<stdio.h>
#define M int main(
#define add(a,b) (a+b)
M){ //如果去掉M编译会出错,原因???
int a = 123; ------
int b = 1; |
int c = add(a,b); |
printf("a = :%d\n",a); |
printf("c = %d\n",c); |
return 0; |
} ∨
#define N int main( //这里必须换行分开,否则编译会报错,此处"N"相当于"int main("
#define add(a,b) (a+b)//在此处的宏定义函数,就相当于在"int amin()"之前定义的一样
N){ //此处的"N"被替换成“int main(”连起来就和"int main()"一样
int a = 123456789;
printf("a = :%d\n",a);
return 0;
}
****能够正确执行*****
/*
*******错误的例子*****
define M (M*10)
int main()
{
int aa = M;
printf("aa = %d\n",aa);
return 0;
}
*/
*******编译错误********
3,typedef:
------------------------------day--10--结构体数组和结构体指针---------------------------------------
结构体总大小
*****************************************
结构体长度的计算:
如结构体:
struct data{
int a;
char b;
char c;
};
int a的长度为4,偏移量为0,0是4的整数倍,不用填充;
char b的长度为1,偏移量为4,4是1的整数倍,不用填充;
char c的长度为1,偏移量为5,5是1的整数倍,不用填充;
整个结构体目前占用的总空间为6,结构体中最长的元素为
如结构体:
struct data{
int a;
char b;
char c;
};
int a的长度为4,偏移量为0,0是4的整数倍,不用填充;
char b的长度为1,偏移量为4,4是1的整数倍,不用填充;
char c的长度为1,偏移量为5,5是1的整数倍,不用填充;
整个结构体目前占用的总空间为6,结构体中最长的元素为
int a(4个字节),而6不是4的整数倍,所以需要填充2个
字节,最后结构体的长度为8个字节。
*****************************************
#include<stdio.h>
struct weapon{
char name[20];
int atk;
int price;
};
int main(){
int a = 0;
float b=0.0;
//定义weapon_1结构体变量,并初始化列表
struct weapon weapon_1 = {"weapon_name,100,200"};
printf("%s\n",weapon_1.name);
//结构体数组
struct weapon weapon_2[2] = {"weapon_name1",50,100,"weapon_name2",100,200};
printf("%s\n,%d\n",weapon_2[0].name,weapon_2[1].name);
//结构体指针
struct weapon * w;
w=&weapon_1;
//注意此处,(*w)的"()"不能省略,(*w).name相当于w->name
printf("%s\n,%d\n",(*w).name);
return 0;
}
------------------------------day--11--共用体---------------------------------------
#include<stdio.h>
//共用体所有成员共享同一块地址
union data{
int a;
char b;
int c;
}
int main()
{
union data data_1;
data_1.b='C';
data_1.a=10;//此处的data_1.a=10;会将data_1.b覆盖掉
printf("%p",&a);//%p表示打印一个指针
return 0;
}