C语言栈区堆区和数据区的使用
1。一维数组名称的含义defineCRTSECURENOWARNINGSincludestdio。hincludestdlib。hincludestring。hincludetime。hstaticvoidprintArray(intarr〔〕,intlen)intarr〔〕等价于intarr{for(inti0;ilen;i){printf(d,arr〔i〕);给人看的printf(d,(arri));给机器看}}staticvoidtest01(){intarr〔5〕{1,2,3,4,5};一维数组名称不是指针printf(sizeofarrd,sizeof(arr));20printf(strlenarrd,strlen(arr));1除了两种特殊情况下,一维数组名称都是指针首元素地址特殊情况1:对数组名称进行sizeof特殊情况2:对数组名称取地址intparr;printf(d,arr);printf(d,arr1);步长差20数组名称指针常量指针的指向不可以修改intconstparrNULL;arr〔0〕100;intlensizeof(arr)sizeof(int);printArray(arr,len);intparr;指向首元素地址p3;〔〕里可以放负数printf(d,p〔0〕);4printf(d,p〔1〕);3printf(d,(p1));3}intmain01(){test01();return0;}
2。数组指针的定义defineCRTSECURENOWARNINGSincludestdio。hincludestdlib。hincludestring。hincludetime。h1、先定义出数组的类型,在通过类型创建数组指针staticvoidtest01(){intarr〔5〕{1,2,3,4,5};typedefint(ARRAYTYPE)〔5〕;ARRYTYPE是一个数据类型,代表有5个int型元素的数组ARRAYTYPEarrparr;printf(d,arrp);printf(d,arrp1);for(inti0;i5;i){printf(d,(arrp)〔i〕);arrp等价于arr}}2、先定义数组指针的类型,在创建数组指针变量staticvoidtest02(){intarr〔5〕{1,2,3,4,5};typedefint(ARRAYTYPE)〔5〕;ARRAYTYPEarrparr;}3、直接创建数组指针变量建议使用这种staticvoidtest03(){intarr〔5〕{1,2,3,4,5};int(parr)〔5〕arr;for(inti0;i5;i){printf(d,(parr)〔i〕);}}intmain02(){test01();test02();test03();return0;}
4。指针数组排序defineCRTSECURENOWARNINGSincludestdio。hincludestdlib。hincludestring。hincludetime。h从小到大,选择顺序voidselectSort01(intarr〔〕,intlen){for(inti0;ilen;i){intmini;认定i为最小值for(intji1;jlen;j){if(arr〔j〕arr〔min〕){更新最小值下标minj;}}if(min!i){inttemparr〔i〕;arr〔i〕arr〔min〕;arr〔min〕temp;}}}staticvoidprintArray(intarr〔〕,intlen){for(inti0;ilen;i){printf(d,arr〔i〕);}}staticvoidtest01(){intarr〔〕{4,5,3,2,1};intlensizeof(arr)sizeof(int);selectSort01(arr,len);printArray(arr,len);}通过选择排序算法计算后,实现对指针数据的降序排列voidselectSort(charparr,intlen){for(inti0;ilen;i){intmaxi;认定最大值下标为ifor(intji1;jlen;j){if(strcmp(parr〔max〕,parr〔j〕)0){更新最大值下标maxj;}}if(i!max){交换i和max的下标元素chartempparr〔max〕;parr〔max〕parr〔i〕;parr〔i〕temp;}}}staticvoidprintCharArray(charparr,intlen){for(inti0;ilen;i){printf(s,parr〔i〕);}}staticvoidtest02(){charparr〔〕{aaa,bbb,ccc,ddd,eee,fff};intlensizeof(parr)sizeof(char);selectSort(parr,len);printCharArray(parr,len);}intmain04(){test01();test02();return0;}
5。结构体概念defineCRTSECURENOWARNINGSincludestdio。hincludestdlib。hincludestring。hincludetime。htypedefstructperson{charname〔64〕;intage;不要在定义结构体时赋值}myperson;myperson是structperson类型的别名staticvoidtest01(){mypersonp{aaa,22};}structperson2{charname〔64〕;intage;}myperson2{bbb,12};myperson是一个结构体变量staticvoidtest02(){printf(姓名:s年龄:d,myperson2。name,myperson2。age);myperson2。age100;strcpy(myperson2。name,b);printf(姓名:s年龄:d,myperson2。name,myperson2。age);}struct{charname〔64〕;intage;}myperson3{ccc,13};匿名类型,后期无法使用staticvoidtest03(){printf(姓名:s年龄:d,myperson3。name,myperson3。age);}staticvoidtest04(){在栈上创建结构体structpersonp1{aa,11};在堆区创建结构体structpersonp2malloc(sizeof(structperson));p2age100;strcpy(p2name,bb);}staticvoidprintArray(structpersonpons〔〕,intlen){for(inti0;ilen;i){printf(姓名:s年龄:d,pons〔i〕。name,pons〔i〕。age);}}staticvoidtest05(){结构体变量数组在栈上创建structpersonpons〔〕{{aaa,11},{bbb,12},{ccc,13},{ddd,14}};intlensizeof(pons)sizeof(structperson);4printArray(pons,len);在堆区创建structpersonponssmalloc(sizeof(structperson)4);for(inti0;i4;i){sprintf(ponss〔i〕。name,nameid,i);ponss〔i〕。agei18;}printArray(ponss,4);if(ponss!NULL){free(ponss);ponssNULL;}}intmain05(){test02();test03();test05();return0;}
6。结构体赋值defineCRTSECURENOWARNINGSincludestdio。hincludestdlib。hincludestring。hincludetime。hstructperson{charname〔64〕;intage;};staticvoidtest01(){structpersonp1{tom,11};structpersonp2{Jerry,12};p1p2;printf(p1姓名:sp1年龄:d,p1。name,p1。age);printf(p2姓名:sp2年龄:d,p2。name,p2。age);}structperson2{charname;intage;};staticvoidtest02(){structperson2p1;p1。age11;p1。namemalloc(sizeof(char)64);strcpy(p1。name,tom);structperson2p2;p2。age13;p2。namemalloc(sizeof(char)128);strcpy(p2。name,jerry);p1p2;默认是浅拷贝自己提供赋值操作深拷贝先释放原有内容if(p1。name!NULL);{free(p1。name);p1。nameNULL;}p1。namemalloc(strlen(p2。name)1);strcpy(p1。name,p2。name);p1。agep2。age;printf(p1姓名:sp1年龄:d,p1。name,p1。age);printf(p2姓名:sp2年龄:d,p2。name,p2。age);if(p1。name!NULL){free(p1。name);p1。nameNULL;}if(p2。name!NULL){free(p2。name);p2。nameNULL;}}intmain06(){test01();test02();return0;}
7。结构体嵌套一维数组defineCRTSECURENOWARNINGSincludestdio。hincludestdlib。hincludestring。hincludetime。hstructperson{charname;intage;};structpersonallocateSpace(){structpersonpArraymalloc(sizeof(structperson)3);for(inti0;i3;i){给每个结构体开辟内存pArray〔i〕malloc(sizeof(structperson));给每个结构体姓名开辟内存pArray〔i〕namemalloc(sizeof(char)64);sprintf(pArray〔i〕name,named,i1);pArray〔i〕agei20;}returnpArray;}staticvoidprintArray(structpersonpArray,intlen){for(inti0;ilen;i){printf(姓名:s年龄:d,pArray〔i〕name,pArray〔i〕age);}}staticvoidfreeSpace(structpersonpArray,intlen){for(inti0;ilen;i){释放姓名if(pArray〔i〕name!NULL){printf(s被释放,pArray〔i〕name);free(pArray〔i〕name);pArray〔i〕nameNULL;}释放结构体free(pArray〔i〕);pArray〔i〕NULL;}释放数组free(pArray);pArrayNULL;staticvoidtest01(){structpersonparrayNULL;malloc(sizeof(structperson)3);parrayallocateSpace();printArray(parray,3);释放内存freeSpace(parray,3);parrayNULL;}intmain(){test01();return0;}