C语言学习7-1:使用6级指针访问一个整数,使用隐式内存分配中转,约瑟夫环
1,使用6级指针访问一个整数,使用隐式内存分配中转
#include <stdio.h> #include <stdlib.h> //构建六级指针访问一个整数 //使用隐式内存分配中转 //这个程序只是做人工分配内存的目的 int main(void) { int ******p=NULL; int a=16; p=malloc(sizeof(int *****));//同下 *p=malloc(sizeof(int ****));//同下 **p=malloc(sizeof(int ***));//同下 ***p=malloc(sizeof(int **));//同下 ****p=malloc(sizeof(int *));//开辟空间存放*****p的地址内含关系 //****p=&*****p *****p=&a; printf("a=%d,******p=%d\n",a,******p); free(****p); free(***p); free(**p); free(*p); free(p); return 0; }
结果:
a=16,******p=16
1-2,
#include <stdio.h> #include <stdlib.h> int main(void) { int ******p6=NULL; int a=16; p=malloc(sizeof(void*)*5);//五个一维空指针型变量空间 int i; for(i=0;i<5;i++) p[i]=(void*)&p[i+1];//前面的储存后面的地址,层层指向 //建立指针指向关系 p[4]=(void*)&a;//p[4]所存的地址重新赋值 printf("a=%d,******p=%d\n",a,******p); free[p]; return 0; }
结果都一样。
2,约瑟夫环
#include <stdio.h> #include <stdlib.h> //约瑟夫环:m个人,以n做作为起始循环的间隔。 // char **alloc_mem(int row,int col) { char **p=NULL; p=malloc(row*sizeof(char *));//分配行空间 if(NULL==p) goto err0;//开辟空间失败直接退出函数,返回空 int i,j; for(i=0;i<row;i++)//分配列空间 { *(p+i)=malloc(col*sizeof(char)); if(NULL==p[i]) goto err1; } return p; err1: for(j=0;j<i;j++)//清k函数 free(p[j]); free(p); err0: return NULL; } void rand_name(char **p,int row,int col) { int i,j; for(i=0;i<row;i++) { p[i][0]=(rand()%26+'A');//首字母大写 for(j=1;j<col-1;j++) { p[i][j]=(rand()%26+'a');//其余都小写 } p[i][j]='\0';//字符串后面跟上一个结束符 } } void print_name(char **p,int row,int col) { int i; for(i=0;i<row;i++) { printf("%2d:%s ",i+1,p[i]);//打每一行印字符串 if((i+1)%4==0) putchar('\n');//四位一行 } putchar('\n'); } int main(void ) { int m,n; char **pname=NULL;//必须选用二级指针,因为这个需要行指向列 printf("input m&n:"); scanf("%d%d",&m,&n); pname=alloc_mem(m,7);//7为存储人名的长度。 rand_name(pname,m,7); print_name(pname,m,7); int out=0,count=0; int i; while(out<m)//限定循环几个N次 { for(i=0;i<m;i++) { count++;//其实就是加1,直到循环到第N人 //的时候进入下面的处理:
printf("pname[%d]= %s",pname[i]); if(count==n)// { printf("%2d:%s\n",i+1,pname[i]); //pname[i]里面存储了一个名字的地址 out++; count=0;//作为记载是否n次的变量,一次n //完后要重新赋值零。 } } }
for(i=0;i<m;i++)
free(pname[i]);
free[pname]; return 0; }
结果:
PS:控制部分,利用out做为记录N次循环的次数,count作为记录N次循环内部的每一次循环,而外面的i则是周而复始的从0开始不停,准确定位在m个人的某一位上。
pls input m & n: 5 3
1: Nwlrbb 2: Mqbhcd 3: Arzowk 4: Kyhidd
5: Qscdxr
=========================
退出顺序:
pname[0]=Nwlrbb
pname[1]=Mqbhcd
pname[2]=Arzowk
3: Arzowk
pname[3]=Kyhidd
pname[4]=Qscdxr
pname[0]=Nwlrbb
1: Nwlrbb
pname[1]=Mqbhcd
pname[2]=Arzowk
pname[3]=Kyhidd
4: Kyhidd
pname[4]=Qscdxr
pname[0]=Nwlrbb
pname[1]=Mqbhcd
2: Mqbhcd
pname[2]=Arzowk
pname[3]=Kyhidd
pname[4]=Qscdxr
5: Qscdxr