博客文章

二维数组和指针

作者: andy.      时间: 2016-03-07 14:51:17

        今天上课,老师说有有很多人指针全部用指针代替。自学C,恰好前两天刚看了这儿。总结一下自己的体会~先贴代码和运算结果。再说体会~~

        代码:

#include<stdio.h>
#include<stdlib.h>

int main(void) {
    {
        char *firstArray[] = { "a","bb","c^c" };
        printf("FirstArray's size:%d\n", sizeof(firstArray));
        for (int i = 0; i < 3; i++)
        {
            printf("%s\n", *(firstArray + i));
        }
        printf("firstArray:%d\n", firstArray);
        printf("firstArray + 1:%d\n", firstArray + 1);
        printf("firstArray + 2:%d\n", firstArray + 2);
        printf("*(firstArray + 2)[1]:%c\n", *(*(firstArray + 2) + 1));
        printf("-----------------------------------------------\n");
    }
    {
        char secondArray[3][10] = { "a","bb","c^c" };
        printf("secondArray's size:%d\n", sizeof(secondArray));
        for (int i = 0; i < 3; i++)
        {
            printf("%s\n", *(secondArray + i));
        }
        printf("secondArray:%d\n", secondArray);
        printf("secondArray + 1:%d\n", secondArray + 1);
        printf("secondArray + 2:%d\n", secondArray + 2);
        printf("*(secondArray + 2)[1]:%c\n", *(*(secondArray + 2) + 1));
        printf("-----------------------------------------------\n");
    }
    {
        char **threeArray = (char **)malloc(3 * sizeof(char*));
        printf("threeArray's size:%d\n", sizeof(threeArray));

        *threeArray = (char *)malloc(2 * sizeof(char));
        *(threeArray + 1) = (char *)malloc(3 * sizeof(char));
        *(threeArray + 2) = (char *)malloc(4 * sizeof(char));

        sprintf(*threeArray, "%s", "a");
        sprintf(*(threeArray + 1), "%s", "bb");
        sprintf(*(threeArray + 2), "%s", "c^c");
        for (int i = 0; i < 3; i++)
        {
            printf("%s\n", *(threeArray + i));
        }

        printf("threeArray:%d\n", threeArray);
        printf("threeArray + 1:%d\n", threeArray + 1);
        printf("threeArray + 2:%d\n", threeArray + 2);
        printf("*(threeArray + 2)[1]:%c\n", *(*(threeArray + 2) + 1));

        free(*(threeArray + 2));
        free(*(threeArray + 1));
        free(*threeArray);
        free(threeArray);
    }

    getchar();
}

        运算结果:

PS D:\Visual Studio\Projects\C__> vim test.c
PS D:\Visual Studio\Projects\C__> gcc .\test.c -std=c99
PS D:\Visual Studio\Projects\C__> .\a.exe
FirstArray's size:12
a
bb
c^c
firstArray:6422292
firstArray + 1:6422296
firstArray + 2:6422300
*(firstArray + 2)[1]:^
-----------------------------------------------
secondArray's size:30
a
bb
c^c
secondArray:6422262
secondArray + 1:6422272
secondArray + 2:6422282
*(secondArray + 2)[1]:^
-----------------------------------------------
threeArray's size:4
a
bb
c^c
threeArray:6762448
threeArray + 1:6762452
threeArray + 2:6762456
*(threeArray + 2)[1]:^

        编译运行都没有问题哈。

        firstArray是一个指针数组。包含着三个指针,这三个指针分别指向三个内存块,这三个内存块分别存储着a, bb, c^c。因为是指针数组且包含三个指针,所以firstArray的长度为12,步长为4。*(*(firstArray + 2) + 1)firstArray指向的是指针数组,所以加2后表示的是这个指针数组中的第3个指针变量,再*,得到其指针变量指向的内存块,该内存块存储着c^c。


        看secondArray,直接定义了一个二维数组,存着a, bb, c^c。这个和firstArray几乎没什么区别。因为是数组,所以长度自然就为30。步长10。(firstArray + 2) + 1)的解释也是一样的~~有必要指出secondArray代表的是数组首元素的地址,而&secondArray才代表整个数组的地址。


        threeArray,我用Visual Studio的时候看Memory看了一会儿才明白,果然20几岁的思维赶不上十几岁哎。分配了12个字节给threeArray(三个指针的长度),很明显就是指针数组。存储着三个指针。一下代码分配内存并将地址块的首地址分配给这三个指针。

*threeArray = (char *)malloc(2 * sizeof(char));
*(threeArray + 1) = (char *)malloc(3 * sizeof(char));
*(threeArray + 2) = (char *)malloc(4 * sizeof(char));

sprintf(*threeArray, "%s", "a");
sprintf(*(threeArray + 1), "%s", "bb");
sprintf(*(threeArray + 2), "%s", "c^c");

        最后输出的结果和1、2的结果吻合。因为threeArray是指向数组的数组指针,所以size只有四个字节。


        结尾的时候看到OneNote上面有点儿代码和结果,验证了一上面加粗的那句话。代码:

#include<stdio.h>
#include<stdlib.h>
 
int main(void){
    typedef int (MyArray)[5];
    MyArray a;
    for(int i = 0;i < 5;i++){
    	*(a + i) = i;
    }
 
    printf("a's size:%d\n",sizeof(a));
    printf("%d %d",&a,&a + 1);
}

        结果:

a's size:20
6422296 6422316