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
浙公网安备 33010602011771号