Linux下的C语言学习笔记(2)

时间:2021-12-16 09:18:03

------------------------------day--7--内存管理---------------------------------------

系统内核:留给系统的正常运行必不可少的栈:编写的程序运行时存放变量的堆:数据段:存放全局变量,常量的代码段:存放编译好的代码2,函数指针:int quadrate(int a);
// main中
int a=3;
int (*pquadrate)(int a);
pquadrate = &quadrate;
//必须加上“()”才会是指向一个函数的指针!!!
int s = (*pquadrate) (a);
//最后就相当

//int s = quardrate(a);Linux下的C语言学习笔记(2)Linux下的C语言学习笔记(2)

------------------------------day--8--数组声明和内存排序---------------------------------------

1,x/nd:0x7fffffffde1cx:为要打印输出的内存地址n:要打印输出几个内存的值
d:按十进制显示
2,指针常量和指针变量:int arr[10];int p=arr;其中arr为指针常量*p为指针变量

------------------------------day--9--预处理宏函数和typedef---------------------------------------

.c文件-->.i文件-->.s文件-->.o文件-->可执行文件       预处理   编译     汇编      链接   1,预处理:
//生成预处理文件gcc -o hello.i hello.c -E2,宏定义:#define R 10//编译的时候把R替换为103,宏函数:代码实例:#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 * 替换为ptypedef 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=20helloworldb=220c=220e=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,结构体中最长的元素为
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;}