C语言栈区堆区和数据区的使用
1.一维数组名称的含义#define _CRT_SECURE_NO_WARNINGS #include #include #include #include static void printArray(int arr[], int len)//int arr[]等价于 int * arr { for (int i=0; i < len; i++) { //printf("%d ", arr[i]);//给人看的 printf("%d ", *(arr + i));//给机器看 } } static void test01() { int arr[5] = { 1,2,3,4,5 }; //一维数组名称不是指针 printf("sizeof arr=%d ", sizeof(arr));//20 printf("strlen arr=%d ", strlen(arr));//1 //除了两种特殊情况下,一维数组名称都是指针首元素地址 //特殊情况1:对数组名称进行sizeof //特殊情况2:对数组名称取地址 //int* p = &arr; printf("%d ", &arr); printf("%d ", &arr+1);//步长差20 //数组名称 指针常量 指针的指向不可以修改 int*const p /* *arr = NULL; arr[0] = 100;*/ int len = sizeof(arr) / sizeof(int); printArray(arr, len); int* p = arr;//指向首元素地址 p += 3; //[]里可以放负数 printf("%d ", p[0]);//4 printf("%d ", p[-1]);//3 printf("%d ", *(p-1));//3 } int main01() { test01(); return 0; }
2.数组指针的定义#define _CRT_SECURE_NO_WARNINGS #include #include #include #include //1、先定义出数组的类型,在通过类型创建数组指针 static void test01() { int arr[5] = { 1,2,3,4,5 }; typedef int(ARRAY_TYPE)[5];//ARRY_TYPE是一个数据类型,代表有5个int型元素的数组 ARRAY_TYPE* arrp = &arr; //printf("%d ", arrp); //printf("%d ", arrp+1); for (int i = 0; i < 5; i++) { printf("%d ", (*arrp)[i]);//*arrp等价于arr } } //2、先定义数组指针的类型,在创建数组指针变量 static void test02() { int arr[5] = { 1,2,3,4,5 }; typedef int(*ARRAY_TYPE)[5]; ARRAY_TYPE arrp = &arr; } //3、直接创建数组指针变量 建议使用这种 static void test03() { int arr[5] = { 1,2,3,4,5 }; int(*parr)[5] = &arr; for (int i = 0; i < 5; i++) { printf("%d ", (*parr)[i]); } } int main02() { //test01(); //test02(); test03(); return 0; }
4.指针数组排序#define _CRT_SECURE_NO_WARNINGS #include #include #include #include //从小到大,选择顺序 void selectSort01(int arr[],int len) { for (int i = 0; i < len; i++) { int min = i;//认定i为最小值 for (int j = i + 1; j < len; j++) { if (arr[j] < arr[min]) { //更新最小值下标 min = j; } } if (min != i) { int temp = arr[i]; arr[i] = arr[min]; arr[min] = temp; } } } static void printArray(int arr[], int len) { for (int i = 0; i < len; i++) { printf("%d ", arr[i]); } } static void test01() { int arr[] = { 4,5,3,2,1 }; int len = sizeof(arr) / sizeof(int); selectSort01(arr, len); printArray(arr, len); } //通过选择排序算法计算后,实现对指针数据的降序排列 void selectSort(char**parr,int len) { for (int i = 0; i < len; i++) { int max = i;//认定最大值下标为i for (int j = i + 1; j < len; j++) { if (strcmp(parr[max], parr[j]) < 0) { //更新最大值下标 max = j; } } if (i != max) { //交换i和max的下标元素 char* temp = parr[max]; parr[max] = parr[i]; parr[i] = temp; } } } static void printCharArray(char** parr, int len) { for (int i = 0; i < len; i++) { printf("%s ", parr[i]); } } static void test02() { char* parr[] = { "aaa","bbb","ccc","ddd","eee","fff" }; int len = sizeof(parr) / sizeof(char*); selectSort(parr,len); printCharArray(parr, len); } int main04() { //test01(); test02(); return 0; }
5.结构体概念#define _CRT_SECURE_NO_WARNINGS #include #include #include #include typedef struct person { char name[64]; int age;//不要在定义结构体时赋值 }myperson;//myperson是struct person类型的别名 static void test01() { myperson p = { "aaa",22 }; } struct person2 { char name[64]; int age; }myperson2 = {"bbb",12};//myperson是一个结构体变量 static void test02() { printf("姓名:%s 年龄:%d ", myperson2.name, myperson2.age); myperson2.age = 100; strcpy(myperson2.name, "b"); printf("姓名:%s 年龄:%d ", myperson2.name, myperson2.age); } struct { char name[64]; int age; }myperson3 = {"ccc",13}; //匿名类型,后期无法使用 static void test03() { printf("姓名:%s 年龄:%d ", myperson3.name, myperson3.age); } static void test04() { //在栈上创建结构体 struct person p1 = { "aa",11 }; //在堆区创建结构体 struct person* p2 = malloc(sizeof(struct person)); p2->age = 100; strcpy(p2->name, "bb"); } static void printArray(struct person pons[], int len) { for (int i = 0; i < len; i++) { printf("姓名:%s 年龄:%d ", pons[i].name, pons[i].age); } } static void test05() { //结构体变量数组 //在栈上创建 struct person pons[] = { {"aaa", 11}, {"bbb", 12}, {"ccc", 13}, {"ddd", 14} }; int len = sizeof(pons) / sizeof(struct person);//4 printArray(pons, len); //在堆区创建 struct person* ponss = malloc(sizeof(struct person) * 4); for (int i = 0; i < 4; i++) { sprintf(ponss[i].name, "name_i=%d", i); ponss[i].age = i + 18; } printArray(ponss, 4); if (ponss != NULL) { free(ponss); ponss = NULL; } } int main05() { //test02(); //test03(); test05(); return 0; }
6.结构体赋值#define _CRT_SECURE_NO_WARNINGS #include #include #include #include struct person { char name[64]; int age; }; static void test01() { struct person p1 = { "tom",11 }; struct person p2 = { "Jerry",12 }; p1 = p2; printf("p1姓名:%s p1年龄:%d ", p1.name, p1.age); printf("p2姓名:%s p2年龄:%d ", p2.name, p2.age); } struct person2 { char* name; int age; }; static void test02() { struct person2 p1; p1.age = 11; p1.name = malloc(sizeof(char) * 64); strcpy(p1.name,"tom"); struct person2 p2; p2.age = 13; p2.name = malloc(sizeof(char) * 128); strcpy(p2.name, "jerry"); //p1 = p2; //默认是浅拷贝 //自己提供赋值操作 深拷贝 //先释放原有内容 if (p1.name != NULL); { free(p1.name); p1.name = NULL; } p1.name = malloc(strlen(p2.name) + 1); strcpy(p1.name, p2.name); p1.age = p2.age; printf("p1姓名: % s p1年龄: % d ", p1.name, p1.age); printf("p2姓名: % s p2年龄: % d ", p2.name, p2.age); if (p1.name != NULL) { free(p1.name); p1.name = NULL; } if (p2.name != NULL) { free(p2.name); p2.name = NULL; } } int main06() { //test01(); test02(); return 0; }
7.结构体嵌套一维数组#define _CRT_SECURE_NO_WARNINGS #include #include #include #include struct person { char* name; int age; }; struct person** allocateSpace() { struct person** pArray = malloc(sizeof(struct person*) * 3); for (int i = 0; i < 3; i++) { //给每个结构体开辟内存 pArray[i] = malloc(sizeof(struct person)); //给每个结构体姓名开辟内存 pArray[i]->name = malloc(sizeof(char) * 64); sprintf(pArray[i]->name, "name_%d", i + 1); pArray[i]->age = i + 20; } return pArray; } static void printArray(struct person ** pArray, int len) { for (int i = 0; i < len; i++) { printf("姓名:%s 年龄:%d ", pArray[i]->name, pArray[i]->age); } } static void freeSpace(struct person** pArray, int len) { for (int i = 0; i < len; i++) { //释放姓名 if (pArray[i]->name != NULL) { printf("%s被释放 ", pArray[i]->name); free(pArray[i]->name); pArray[i]->name = NULL; } //释放结构体 free(pArray[i]); pArray[i] = NULL; } //释放数组 free(pArray); pArray = NULL; static void test01() { struct person** parray = NULL;//malloc(sizeof(struct person*) * 3); parray = allocateSpace(); printArray(parray, 3); //释放内存 freeSpace(parray,3); parray = NULL; } int main() { test01(); return 0; }
关于交友的数量与质量晓风残月,子夜沉思朋友靠质量,不靠数量。人生走着走着自己都不知是什么时候,发现好多社交是无用的的?记得,在读大学的时候,常常约几个同学,一起吃吃喝喝,喜欢醉后的无话不说。那时候起码
佟丽娅陈思诚婚变对婚姻的反思佟丽娅陈思诚离婚了,网上在沸腾了,对此我有如下不怎么深刻的对婚姻的反思。欢迎有智者交流。其实离婚肯定是当事人的事,旁观者没必要说三道四,也无权给他人定义裁判对与错。婚姻是否适合永远
惬意于南山图书馆里的缱绻时光人生最好的旅行,就是空间之余进入一个无人打扰的地方,发现一种久违的感动,一个幽静的图书馆,或者你搬到一个新的小区,邻里之间谁也不认识,出门进门不用打招呼,谁也不知道你是谁,这种感觉
18决赛最后一战,这道世界杯下酒菜了解一下世界杯淘汰赛进行到一半,夺冠热门纷纷回家,巴墨之战赛前还在猜测,内马尔会不会步梅老板和总裁的后尘。五星王者巴西迎战北美之王墨西哥,结果令人振奋,内马尔稳得一比!一进球一助攻,直接促
吸睛能力MAX,XESS亮相CES2019,多款生态链产品惊艳世界作为CES展的常驻实力派,TCL在今年展会上不仅推出了X10QLED8KTV等在内的多款电视新品,也将XESS生态链产品带上了国际舞台。作为TCL的高端子品牌,XESS旗下首款产品
穷人装富人,富人装穷人,一个伪装的世界多精彩穷人装富人,富人装穷人,这世界伪装何时了。层次决定人意识与思维。穷人穷久了,所处圈层多属同类。他们日夜做梦都是一夜暴富,但谈何容易,正如一句网络流行语晚上想起千条路,早上起来走原路
苏宁818电脑数码榜单国产品牌狂吸眼球,华为音箱突然大卖距离8月18日苏宁发烧购物节的时间越来越短,苏宁各大版块的人气也越来越旺盛,各大品牌各款产品的重磅优惠接连放出,广大消费者更是剁手到停不下来。而值得注意的是,电脑数码版块一直以来都
苏宁全民焕新节悟空榜GSHOCK王者荣耀联名款手表热卖春天可以没有新潮的发色,也可以没有精致的美甲,但一定要有漂亮的服装首饰。苏宁全民焕新节,其优惠力度堪称上半年的双11,此外还有新品扎堆上市,315品质服务保障,让消费者的购物体验得
苏宁618空调销量榜柜机销量奥克斯首次夺冠空调是夏天最为重要的降温神器,眼看气温越来越高了,这一家电也迎来热销。苏宁作为中国最大的家电渠道,在618刚开始的时候就迎来了一次空调购买大热潮,不仅有打破历史价的空调爆款,还有各
摄影游戏样样精通,双十一还没到我为什么着急下手这台双屏神器?毫无疑问,对于剁手党来讲双十一一定是最值得期待的,进入十一月,不仅是京东淘宝还是苏宁,不管是快消家电还是手机电脑只有一个主题,那就是买买买!可以说这是目前败家味道最浓的一个节了,错
苏宁焕新节手机悟空榜华为后来居上勇夺安卓阵营双料冠军自第一届苏宁315全民焕新节启幕以来,以数码3C为代表的品类集体爆发,销量呈井喷趋势。尤其苏宁易购特为焕新节启动了悟空榜,每日公布全品类的详细销售实况后,各品牌商家更是打了鸡血般疯