• 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


    
    
    
     
  • 相关阅读:
    拜师鸟哥之linux学习体会(1)——计算器概论
    LeetCode刷题1
    jupyter notebook直接打开.md格式的文件
    [图论]最短网络:prim
    [图论]最短网络:kruskal
    [图论]最优布线问题:kruskal
    A+B Problem
    [图论]最优布线问题:prim
    [图论]求连通分量
    [图论]连通图:深搜(邻接矩阵)
  • 原文地址:https://www.cnblogs.com/will-boot/p/3303505.html
Copyright © 2020-2023  润新知