今日学习笔记

一、变量

1.局部变量

局部变量的定义:在{}内

局部变量的申明周期:离开大括号就结束

为什么局部变量离开大括号{}生命周期就结束呢?————内存(栈区)

2.全局变量

全局变量 ——内存在全局区

全局变量在整个程序里面都可以被访问

3.静态变量

静态变量只初始化一次,存放在全局区

二、内存

1.栈区:一种先进后出的存储结构, 函数的参数,函数的返回值都是栈区变量。不需要用户申请释放,编译器自动完成

2.全局区:程序被加载到内存时就已经分配好,程序退出时才从内存中消失。

3.静态全局区:static函数

4.堆区:一个比较大的内存容器(比栈区大,约为4G大小),需要我们手动的申请和释放内存。

int a = 0; //全局初始化区   
char *p1; //全局未初始化区   
main()   
{   
    int b;// 栈   
    char s[] = "abc"; //栈   
    char *p2; //栈   
    char *p3 = "123456"; //"123456"在全局区,p3在栈上。   
    static int c =0; //全局(静态)初始化区   
    p1 = (char *)malloc(10);   
    p2 = (char *)malloc(20);   //分配得来得10和20字节的区域就在堆区。   
    strcpy(p1, "123456"); //"123456"放在全局区,编译器可能会将它与p3所指向的"123456"优化成一个地方。   
}

8b66e51f023e457680ec4518b4079926.png

三、版本

1.发行版本——release版本(正式版本)

0bb865d11571489f8b31c9f863fcdc1f.png

2.测试版本——Beta版本(Debug版本,比正式版本要大)

849c9cc39d7447b786340c0e899b2ecb.png

 

四、纠错

打开终端输入:gcc -g 文件名.c

                         gdb a.out

                         run

五、三目运算符及NULL

条件判断 ? 返回值1:返回值2;

int a = 5; 
int b = 3; 
int c = a > b ? 1 : 0;//c = 1

判断a是否大于b,如果大于则返回 1,如果小于返回0。

int res = ptr == NULL ? 1 : 0;//判断字符串ptr是否为空

当字符串为NULL时,则不能使用strlen,strcpy,strcat等函数,因为NULL段是受保护的区域。

d74004c5812443da98bb2b6b55373274.png

六、复合数据类型

1.结构体的定义:用来描述复杂对象,如:书,人等具有多个特征的变量。


struct Person//定义结构体名称
{
    /*多个特征变量*/
    int age;             //4
    char name[20];       //20
    char sex ;           //1
    int height;          //4
};

2.结构体内存:因为内存对齐缘故,所定义的特征变量不同,所占大小也不同。(如上面所示,理论上内存大小为29字节,实际为32字节)

    /*结构体的定义*/
    struct Person per1;
    /*结构体占用内存大小:因为有内存对其的缘故,所以占用了32字节*/
    int size = sizeof(per1);
    printf("size = %d\n",size);

6a1ace6679184ff882c20dbecf3505e6.png

3.结构体的赋值:结构体名称.特征变量;

    per1.age = 20;
    per1.height = 180;
    per1.sex = 'm';
    strcpy(per1.name,"zhangsan");//因为per1.name是地址,没有内存,所以用strcpy

4.结构体的取值:printf("特征变量对应的数据类型",结构体名称.特征变量);

 printf("name = %s, age = %d, sex = %c,height = %d\n",per1.name,per1.age,per1.sex,per1.height);

5.结构体数组的定义:用于定义多个同种复杂类型对象。

struct Person per[3];//定义Person类型的结构体数组per[3]

6.结构体数组的赋值:结构体数组名[ X ].特征变量

    per[0].age = 20;
    per[0].height = 180;
    per[0].sex = 'm';
    strcpy(per[0].name,"zhangsan");

    per[1].age = 21;
    per[1].height = 179;
    per[1].sex = 'f';
    strcpy(per[1].name,"lisi");

    per[2].age = 18;
    per[2].height = 175;
    per[2].sex = 'm';
    strcpy(per[2].name,"xiaogu");

7.const函数:表示里面的数据只能被读取,不可以被更改。(为了防止疏忽,将重要数据错误更改)

当使用const函数是,结构体的输出变为:printf("特征变量对应的数据类型",结构体名称->特征变量);

#include <stdio.h>
#include <string.h>


/*复合数据类型*/
struct Person
{
    int age;             //4
    char name[20];       //20
    char sex ;           //1
    int height;          //4
};
/*const  constan.恒定不变的,所定义的数据不能变*/
void printPersoInfo(const struct Person *per1)
{
     /*结构体的取值*/
    printf("name = %s,age = %d,sex = %c,height = %d\n",per1->name, per1->age, per1->sex, per1->height);
}
/*姓氏排序*/
void sortPersonInfo(struct Person *per2,int len)
{
    for(int i = 0;i < len;i++)
    { 
        for(int j = i +1;j < len;j++)
        {
            int n = strcmp(per2[i].name,per2[j].name);
            if(n > 0)
        {
            struct Person p2 = per2[j];
            per2[j] = per2[i];
            per2[i] = p2;
        }
        }
    }
}
int main()
{
    struct Person per[3];//定义结构体数组

    per[0].age = 20;
    per[0].height = 180;
    per[0].sex = 'm';
    strcpy(per[0].name,"zhangsan");

    per[1].age = 21;
    per[1].height = 179;
    per[1].sex = 'f';
    strcpy(per[1].name,"lisi");

    per[2].age = 18;
    per[2].height = 175;
    per[2].sex = 'm';
    strcpy(per[2].name,"xiaogu");

    int length = sizeof(per)/sizeof(per[0]);//结构体数组长度
    sortPersonInfo(per,length);//排序函数

    for(int i = 0;i < 3;i++)
    {
        printPersoInfo(&per[i]);
    }

    return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值