zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    第13讲——使用类
    第12讲——对象和类
    第11讲——面向对象编程
    第10讲——名称空间
    数论19——高斯消元
    贪心思想
    重要的转变(感觉自己最近堕落必读)
    java面试
    Java泛型
    系统设计
  • 原文地址:https://www.cnblogs.com/cation/p/3152840.html
Copyright © 2011-2022 走看看