C語言之二維數組與指針


二維數組:

char a[2][3];

二維數組實質上也就是一維數組,a[2][3]可看做一個2個元素的一維數組,這2個元素又是另一個數組,在內存中,它的排布如下:

#include "stdio.h"

int main(int argc, char *argv[])
{
    char a[2][3]={{1,3,9},{2,4,8}};

    for(int i=0; i<2;i++)
        for(int j=0;j <3;j++)
        {
            printf("a[%d][%d]=%d\n", i, j, a[i][j]);
        }
    for(int i=0; i<2;i++)
        for(int j=0;j <3;j++)
        {
            printf("a[%d][%d] Addr=0X%X\n", i, j, (int)&a[i][j]);
        }
    return 0;
}

數組指針:

char a[2][3]={{1,3,9},{2,4,8}};
char (*p)[3]=a;  //a為一維數組的數組名,類型為char (*)[3]
char *p=a[1];    //a[1]為二維數組的數組名,即{2,4,8}數組的首地址,類型為char *
char (*)p[2][3]=&a //&a為整個數組的首地址,類型為char (*)[2][3]

二維數組傳參:

當定義了char a[2][3]={{1,3,9},{2,4,8}},如何將地址傳入到函數中呢。函數對a數組進行修改呢。

void Func(int (*array)[10]);  注意*array需要用括號括起來。

這種形式的傳參是1個指針,指向10個元素的數組,因為[]的優先級比*的優先級高,故*array必須用括號括起來。

#include "stdio.h"
void exchange(char (*p)[3]);

int main(int argc, char *argv[])
{
    char a[2][3]={{1,3,9},{2,4,8}};

    for(int i=0; i<2;i++)
        for(int j=0;j <3;j++)
        {
            printf("a[%d][%d]=%d\n", i, j, a[i][j]);
        }
    printf("exchange\n");
    exchange(&a[1]);
    for(int i=0; i<2;i++)
        for(int j=0;j <3;j++)
        {
            printf("a[%d][%d]=%d\n", i, j, a[i][j]);
        }
    return 0;
}

void exchange(char (*p)[3])
{
    char tmp=(*p)[0];
    (*p)[0] = (*p)[2];
    (*p)[2] = tmp;
}

例子解析:exchange(&a[1])將{2,4,8}數組的首地址傳遞給exchange,exchange使用(*p)獲得{2,4,8}的地址,然后用(*p)[0]、(*p)[1]、(*p)[2]偏移並修改{2,4,8}數組的值。

void Func(int *array[10]);

這種形式的傳參是10元素的數組,每個元素都是指向int型的指針。

#include "stdio.h"
void exchange(char *p[2]);

int main(int argc, char *argv[])
{
    char a[2][3]={{1,3,9},{2,4,8}};

    for(int i=0; i<2;i++)
        for(int j=0;j <3;j++)
        {
            printf("a[%d][%d]=%d\n", i, j, a[i][j]);
        }
    printf("exchange\n");
    char *p[2];
    p[0] = a[0];
    p[1] = a[1];
    exchange(p);
    for(int i=0; i<2;i++)
        for(int j=0;j <3;j++)
        {
            printf("a[%d][%d]=%d\n", i, j, a[i][j]);
        }
    return 0;
}

void exchange(char *p[2])
{
    char tmp=p[1][0];
    p[1][0] = p[1][2];
    p[1][2] = tmp;
}

 例子解析:先使用char *p[2]定義了2個元素的數組,每個元素都是char *型,然后將a[0]和a[1]的地址賦給p[0]和p[1],exchange函數接收到p[2]的地址,使用p[1]就能得到a[1]的地址,然后使用p[1][0]、p[1][1]、p[1][2]偏移到a[1][0]、a[1][1]、a[1][2]。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM