• C语言->实验室->指针数组


    一 分析

      讨论指针数组要从三个层面来考虑:

      1)指针数组本身是什么
      2)指针数组作为参数时的表现
      3)指针数组作为返回值时的表现

    二 指针数组是什么

      1)指针数组--指针的集合

      数组是若干元素的集合,那么指针数组就是若干个指针的集合,这个集合内的所有元素都是独立的指针。

      2)定义一个指针数组

      char* sChar[10];

      这里定义了一个指针数组,‘int*’表明其数据类型为int型指针,‘[10]’表明这个集合有10个指针。

      3)试用

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/types.h>
    
    
    int main()
    {
        char* argList[10];
        char* sChar = "1234567";
        int i;
        
        for(i = 0;i<10;i++)
        {
            argList[i] = (char*)malloc(sizeof(char)*100);
            memset(argList[i],'',100);
            strcpy(argList[i],"1234567890");
        }
    
        for(i = 0;i<10;i++)
        {
            printf("%s
    ",argList[i]);
        }
        
        for(i = 0;i<10;i++)
        {
            free(argList[i]);
        }    
        return 0;
    }    

      输出:

    1234567890
    1234567890
    1234567890
    1234567890
    1234567890
    1234567890
    1234567890
    1234567890
    1234567890
    1234567890

       在上面的例子中,我们可以简单的将指针数组当做一个指针的集合,数组内所有元素都是独立的指针。

    三 指针数组作为参数

      1)常规应用

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/types.h>
    
    
    int main()
    {
        char* argList[10];
        int i;
        
        for(i = 0;i<10;i++)
        {
            argList[i] = (char*)malloc(sizeof(char)*100);
            memset(argList[i],'',100);
            strcpy(argList[i],"1234567890");
        }
    
        DataPrint(argList);
        
        for(i = 0;i<10;i++)
        {
            free(argList[i]);
        }    
        return 0;
    }    
    
    int DataPrint(char* argList[10])
    {
        int i;
        for(i = 0;i<10;i++)
        {
            printf("%s
    ",argList[i]);
        }
    }

      上面的代码中,我们在主函数中为指针数组分配了内存和值,将其作为参数传递给DataPrint函数,在DataPrint函数中将指针数组的值打印出来,如下:

    1234567890
    1234567890
    1234567890
    1234567890
    1234567890
    1234567890
    1234567890
    1234567890
    1234567890
    1234567890

      2)指针数组中每一个元素都是指针

      指针数组中的每一个元素都能当做单独的指针来使用,其特性我们就不多说了。

      3)指针数组作为参数传递时,传递的是地址

      对于非数组参数,在作为参数进行传递时是将其值传递给了函数,而不是该变量本身,例如:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/types.h>
    
    int main()
    {
        int a=1;
        fun(a);
    }
    
    int fun(int b)
    {
        b=3;
        return 0;
    }

      上面的代码中,b的值一开始由a变量传递过来为1,然后在fun函数中被重新赋值为3.整个过程中,a变量的值都是1。

      而数组作为参数进行传递时,考虑到数组内数据量可能很大,所以不会将数组的值传递下去,而是传递该数组的首地址,这样的传递方式就会参数一些有趣的现象。不过在此之前,我们先来看看数组以及指针数组是怎么组成的。

        a)定义一个数组

          int A[10] = {0,1,2,3,4,5,6,7,8,9};

        b)将这个数组作为参数传递

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/types.h>
    
    int main()
    {
        int A[10] = {0,1,2,3,4,5,6,7,8,9};
    
        printf("A[0]:%u
    ",A[0]);
        fun(A);
        printf("A[0]:%u
    ",A[0]);
    
        return 0;
    }
    
    int fun(int B[10])
    {
        B[0]=10;
        return 0;
    }

        在fun函数中,因为数组传递时传递的是地址而非值,于是B数组:

        可以看到,B数组内所有元素在内存中的地址与A数组一致,那么我们改变B数组的值也会间接地改变了A数组的值

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/types.h>
    
    int main()
    {
        int A[10] = {0,1,2,3,4,5,6,7,8,9};
    
        printf("A[0]:%u
    ",A[0]);
        fun(A);
        printf("A[0]:%u
    ",A[0]);
    
        return 0;
    }
    
    int fun(int B[10])
    {
        B[0]=10;
        return 0;
    }

    输出

    A[0]:0
    A[0]:10

        可以看到,A[0]的值在调用fun函数后发生了改变,这是因为数组将地址而不是值传递给了fun函数,在这种情况下,我们可以简单的认为B=A。

        c)定义一个指针数组

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/types.h>
    
    
    int main()
    {
        char* argList[10];
        int i;
        
        for(i = 0;i<10;i++)
        {
            argList[i] = (char*)malloc(sizeof(char)*100);
            memset(argList[i],'',100);
            strcpy(argList[i],"1234567890");
        }
    }

        此时argList在内存中表现为

        d)将指针数组作为参数传递

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/types.h>
    
    
    int main()
    {
        char* argList[10];
        int i;
        
        for(i = 0;i<10;i++)
        {
            argList[i] = (char*)malloc(sizeof(char)*100);
            memset(argList[i],'',100);
            strcpy(argList[i],"1234567890");
        }
    
        DataChange(argList);
        
        for(i = 0;i<10;i++)
        {
            printf("%s
    ",argList[i]);
        }
    
        return 0;
    }    
    
    int DataChange(char* argList[10])
    {
        int i;
        for(i = 0;i<10;i++)
        {
            argList[i]++;
        }
    }

        在上面的代码中,我们在DataChange函数内执行了argList[i]++,那么这一语句具体产生了什么效果?argList[i]表明的是argList的第i个元素,其本质是一个指针,该值加一表明该指针元素指向的地址值加一,所以现在argList的内存表现为:

        argList[0]++使得ABC00中的XX00值加一,跳过了0值,所以最后输出为

    234567890
    234567890
    234567890
    234567890
    234567890
    234567890
    234567890
    234567890
    234567890
    234567890
  • 相关阅读:
    Saltstack module gem 详解
    Saltstack module freezer 详解
    Saltstack module firewalld 详解
    Saltstack module file 详解
    Saltstack module event 详解
    Saltstack module etcd 详解
    Saltstack module environ 详解
    Saltstack module drbd 详解
    Saltstack module dnsutil 详解
    获取主页_剥离百度
  • 原文地址:https://www.cnblogs.com/cation/p/3152840.html
Copyright © 2020-2023  润新知