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
",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
",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]='';//字符串后面跟上一个结束符 
        } 

} 

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('
');//四位一行 
        } 
        putchar('
'); 
} 
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 ",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




 
原文地址:https://www.cnblogs.com/will-boot/p/3303505.html