C语言基础篇六——结构体与内存

#include <stdio.h>
//结构体   是一种自定义的数据类型
//各种不同类型数据组成的一个集合
//struct
//{      //结构体名称
//    结构体类型
//    数据类型  标识符
//}
//结构体名称可以省略
#if 0
struct birthday
{
    int year;
    int month;
    int day;
};
struct student
{
    char name[20];
    float score;
    struct birthday date;
    char subject[8];
    int num;
};
typedef struct student STU;//STU是typedef 更改后的别名

int main()
{
    STU stu = {"xiao",110,{1988,5,20},"iOS",111};
    printf("生日:%d\n",stu.date.month);
    strcpy(stu.name,"罗志祥");
    printf("姓名:%s\n",stu.name);
    memset(&stu,0,sizeof(stu));
}


/*int main(int argc, const char * argv[])
{
    printf("%ld\n",sizeof(struct student));
    STU stu2;
    printf("请输入学生的姓名:\n");
    scanf("%s",stu2.name);
    printf("姓名:%s\n",stu2.name);
    printf("请输入学生的分数:\n");
    scanf("%g",&stu2.score);
    printf("分数:%g\n",stu2.score);
    printf("请输入学生的学号:\n");
    scanf("%d",&stu2.num);
    printf("学号:%d\n",stu2.num);
    printf("请输入学生的科目:\n");
    scanf("%s",stu2.subject);
    printf("科目:%s\n",stu2.subject);
    return 0;
}*/
#endif

#include <string.h>
#if 0
int main()
{
    STU stu[3] = {
        {"laoWang1", 100001, {1967, 2, 29}, "H5", 80.5} ,
        {"laoWang2", 200001, {1965, 3, 29}, "iOS", 93.2} ,
        {"laoWang3", 300001, {1970, 6, 29}, "Android", 59}
    };
    
    printf("%d\n", stu[1].birth.month);
    
    
    
}

#endif
#if 0

#include <stdlib.h>
typedef struct
{
    char name[20];
    int speed;
}Car;
// 1234534
// 4 3 5 4 3 2 1 0 0 0
char *numberToString(int num,char *str)
{
    int i = 0;
    while (num)
    {
        *(str+i) = num % 10 + 48;
        num /= 10;
        i++;
    }
    for (int i=0; i<strlen(str) / 2; ++i)
    {
        char t = str[i];
        str[i] = str[strlen(str)-i-1];
        str[strlen(str)-i-1] = t;
    }
    return str;
}
int main()
{
    Car car[10] = {};
    for (int i=0; i<10; ++i)
    {
        char str[10] = {};
        char bmw[10] = "bmw";
        strcpy(car[i].name, strcat(bmw, numberToString(i+1, str)));
        car[i].speed = arc4random() % 50 + 200;
    }
    for (int i=0; i<9; ++i)
    {
        for (int j=i+1; j<10; ++j)
        {
            if (car[i].speed > car[j].speed)//选择排序的方法。而冒泡排序则是(j=0;j<9-i;++j)[j]与[j+1]比较
            {
                Car temp = car[j];
                car[j] = car[i];
                car[i] = temp;
            }
        }
    }
    for (int i=0; i<10; ++i) {
        printf("车子是:%s\n", car[i].name);
        printf("车子的速度:%d\n", car[i].speed);
        printf("___________________\n");
    }
    
}
#endif
#include <stdlib.h>
#if 0
//chenLi  fangZengAn  haoChaoRan
struct Master
{
    char name[20];
    int ticket;
};

int main()
{
    struct Master master[3] =
    {
        {"chenLi",0},
        {"fangZengAn",0},
        {"haoChaoRan",0},
    };
    for (int i=0; i<20; ++i)
    {
        printf("请输入投票的姓名:\n");
        char name[20];
        scanf("%s",name);
        if (!strcmp(name, master[0].name))
        {
            master[0].ticket++;
        }
        else if (!strcmp(name, master[1].name))
        {
            master[1].ticket++;
        }
        else
        {
            master[2].ticket++;
        }
     }
}
#endif

typedef struct
{
    int stuNum;
    char name[20];
}STU;
void scan(STU *stu)
{
    
}

 

 

内存

动态内存 :

栈,局部变量,形参

堆,  堆内存

编译的时候不知道大小  运行的时候动态计算大小

静态内存

数据段(常量,全局变量,静态局部变量)

代码段   代码

计算机不管理的内存就是堆区

由程序员自己管理

计算机管理的其他区域

编译之前必须依据数据类型 确定大小。

#if 0
void func(int a)
{
    printf("%p\n",&a);
}
int number;//全局变量
int main(int argc, const char * argv[])
{
    //char str[100] = {};
    //scanf("%[^\n]",str);
    //printf("%s\n",str);
    //int year = atoi("2016");
    printf("%p",&number);
    printf("%p\n",func);
    func(number);
    return 0;
}
#endif
#if 0
//超过了K使用堆内存
//int *p = (int *)malloc(100);
//malloc分配内存  返回分配好的内存的首地址
//malloc分配失败  返回NULL。
//void* 可以指向任意的基本类型数据
typedef int zhengShu;//简化一个复杂的函数类型
//typedef int (*p)(int,int);
//1.分配内存
//void *malloc(size_t);
int *p = (int*)malloc(100);
//2.判断内存分配是否成功
  if(!p)
   {
    printf("内存分配失败!\n");
    return -1;
}
//3.使用内存
for(int i=0;i<25;++i)
{
    *(p+i) = i + 1;//写入
}
for(int i=0;i<25;++i)
{
    printf("%d",*(p+i));//遍历
}
printf("\n");
//4.释放内存
//释放你分配好的内存的首地址
//malloc 与 free成对出现
free(p);
p = NULL;//销毁野指针
return 0;
#endif
#if 0
int main()
{
    //int *p = malloc(100 * sizeof(int));
    int *p = calloc(100, sizeof(int));
    if(!p)
    {
        return -1;
    }
    //memset 是内存初始化
    //按照字节操作的
    memset(p, 0, 400);
    for (int i=0; i<100; ++i)
    {
        *(p+i) = i + 1;
        //printf("%d",*(p+i));
    }
    int arr[100] = {};
    memcpy(arr, p, 400);//拷贝
    for (int i=0; i<100; ++i)
    {
        printf("%d ",*(arr+i));//遍历数组
    }
    printf("\n");
    free(p);
    p = NULL;
}
#endif
#if 0
int main()
{
    char *str = malloc(27);
    char *s = str;
    memset(str, 0, 27);
    for (int i='a';i<='z'; i++)
    {
        *s++ = i;
    }
    printf("%s\n",str);
    char *str1 = realloc(str, 10);
    //realloc的作用:
    //1.重新分配内存(加上\0就是10个)
    //2.拷贝原内存到新内存
    //3.释放原内存
    //free(str);已经释放了str,就不能二次释放
    free(str1);//释放内存
    str = NULL;//销毁指针
}
#endif

 

posted on 2016-08-08 13:06  小豌先生  阅读(120)  评论(0)    收藏  举报

导航