9.6 数组的指针和指向数组的指针变量 - 3

9.6 数组的指针和指向数组的指针变量 - 3

  • 一.回顾二维数组和多维数组的概念
  • 二.指向多维数组的指针和指针变量探究
    • 1.a:二维数组名,也是整个二维数组的首地址。我们可以认为是第0行的首地址是1000
    • 2.a+1 , a+2 分别代表第一行首地址和第二行首地址。
    • 3.这表示a[0],a[1],a[2]是一维数组名。
      • (1) a[0] == &a[0][0] == 1000 是第0行元素首地址
      • (2) a[1] == &a[1][0] == 1016 是第1行元素首地址
      • (3) a[2] == &a[2][0] == 1032 是第2行元素首地址
    • 4.第0行第1列元素,地址怎么表示
    • 5.int a[5];一些推论
      • (1)a[0] 等价于*a; 都是地址1000,我们注意到a,*a,也是都是1000
      • (2)a[0] +1等价于*a+1; 等价于 &a[0] [1],等价于1004
      • (3)a[1],等价于*(a+1),等价于1016
      • (4)a[1]+2,等价于*(a+1)+2,等价于 &a[1] [2],等价于1024
    • 6.a[0] +1等价于*a+1; 等价于 &a[0] [1],等价于1004,这是个地址
      • (1)*(a[0] +1)就代表a[0][1]的值; *(*a+ 1) 也是a[0][1]的值
      • (2)*(a[1] + 2),a[1][2]的值,*(*(a+1)+ 2),都表示第1行第2列元素值
  • 三.指针数组和数组指针
    • 1. 指针数组
    • 2.数组指针
  • 四.多维数组的指针做函数参数
  • 五.整理来源

一.回顾二维数组和多维数组的概念

a[3][4];
9.6 数组的指针和指向数组的指针变量 - 3_第1张图片
9.6 数组的指针和指向数组的指针变量 - 3_第2张图片
内存中:
9.6 数组的指针和指向数组的指针变量 - 3_第3张图片
a[2][3][4];

9.6 数组的指针和指向数组的指针变量 - 3_第4张图片

二.指向多维数组的指针和指针变量探究

//可以把a看成一个一维数组,这个一维数组有三个元素: a[0] ,a[1], a[2],每个元素又是一个包含4个元素的一维数组。

9.6 数组的指针和指向数组的指针变量 - 3_第5张图片
9.6 数组的指针和指向数组的指针变量 - 3_第6张图片

1.a:二维数组名,也是整个二维数组的首地址。我们可以认为是第0行的首地址是1000

int main()
{
    int a[3][4];    //数组名a 同样代表数组的首地址
    int *p;
    p = (int *)a;   //强制转换,p指向数组的首地址


    return;
}

2.a+1 , a+2 分别代表第一行首地址和第二行首地址。

所以a+1跳过16个字节,也就是 a = 1000,a+ 1 = 1016;

int main()
{
    int a[3][4];    //数组名a 同样代表数组的首地址
    int *p;

    p = (int *)(a+1);
    p = (int *)(a+2);
    return;
}

0x0034fc6c a的地址 1000
0x0034fc7c a+1的地址 1016
0x0034fc8c a+2的地址 1032

3.这表示a[0],a[1],a[2]是一维数组名。

C语言规定数组名代表数组的首地址,所以就有如下:

(1) a[0] == &a[0][0] == 1000 是第0行元素首地址

(2) a[1] == &a[1][0] == 1016 是第1行元素首地址

(3) a[2] == &a[2][0] == 1032 是第2行元素首地址

int main()
{
    int a[3][4];    //数组名a 同样代表数组的首地址
    int *p;


    p = a[0];   //地址:0x0042f7cc
    p = a[1];   //地址:0x0042f7dc
    return;
}

4.第0行第1列元素,地址怎么表示

&a[0][1], a[0] + 1; --1004

int main()
{
    int a[3][4];    //数组名a 同样代表数组的首地址
    int *p;

    p = &a[0][1];   //地址:0x000ffb30
    p = a[0] + 1;   //地址:0x000ffb30
    return;
}

5.int a[5];一些推论

(1)a[0] 等价于*a; 都是地址1000,我们注意到a,*a,也是都是1000

(2)a[0] +1等价于*a+1; 等价于 &a[0] [1],等价于1004

(3)a[1],等价于*(a+1),等价于1016

(4)a[1]+2,等价于*(a+1)+2,等价于 &a[1] [2],等价于1024

注意,不要把*(a+1)+2写成*(a+3),那就变成a[3];

9.6 数组的指针和指向数组的指针变量 - 3_第7张图片

6.a[0] +1等价于*a+1; 等价于 &a[0] [1],等价于1004,这是个地址

(1)*(a[0] +1)就代表a[0][1]的值; *(*a+ 1) 也是a[0][1]的值

(2)(a[1] + 2),a[1][2]的值,(*(a+1)+ 2),都表示第1行第2列元素值

a[i]的性质问题:
a[i] 和 &a[i]地址是一样的
实例:

int main()
{
    int a[3][4];    //数组名a 同样代表数组的首地址
        int i,j;
        for(i = 0;i < 3;i++)
        {
            for(j = 0;j < 4;j++)
            {
                a[i][j] = 86;
            }
        }
    int *p;
    p = (int *)(a+1);   //第一行首地址;  //a[1][0]....a[1][3]
    *p = 56;  //a[1][0] = 56
    p++;  //走4个字节   a[1][1]
    *p = 78; //相当于a[1][1] = 78;
    return;
}

三.指针数组和数组指针

1. 指针数组

//首先这是个数组,数组中有10个元素,每个元素都是个指针,所以这相当于定义了10个指针变量,也就是p[0]-p[9];
int *p[10]; //能引用的下标是[0]-[9]

int main()
{
    int a[3][4];    //数组名a 同样代表数组的首地址
        int i,j;
        for(i = 0;i < 3;i++)
        {
            for(j = 0;j < 4;j++)
            {
                a[i][j] = 86;
            }
        }
    int *p[4];   //指针数组,能引用的下标[0]-[3]
    p[0] = &a[0][0];
    p[1] = &a[0][1];
    p[2] = &a[0][2];
    p[3] = &a[0][3];

    for(j = 0;j < 4;j++)
    {
        printf("value = %d\n",*(p[j]));
    }

    return;
}

9.6 数组的指针和指向数组的指针变量 - 3_第8张图片

2.数组指针

int (*p)[10];是一个指针变量,这个指针变量用来指向含有10个元素的一维数组。

int main()
{
    int (*p)[10];
    int a[10];    //数组名a 同样代表数组的首地址
    int i,j;
    for(i = 0;i < 10;i++)
    {
            a[i] = i;
    }

    p = &a;     //&地址符
    int *q;
    q = (int *)p;
    for(j = 0;j < 10;j++)
    {
        printf("value = %d\n",*q);
        q++;
    }
    return;
}

9.6 数组的指针和指向数组的指针变量 - 3_第9张图片

int main()
{
    int (*p)[10];
    int a[3][10];    //数组名a 同样代表数组的首地址
    int i,j;
    for(i = 0;i < 3;i++)
    {
        for(j = 0;j < 10;j++)
        {
            a[i][j] = i+j;
        }
    }


    p = a;     //二维数组名可以直接赋值给数组指针
    int *q;
    q = (int *)p;
    for(i = 0;i < 3;i++)
    {
        q = *(p +i);   // 每次指向一个新行
        for(j = 0;j < 10;j++)
        {
            printf("value = %d\n",*q);
            q++;
        }
        printf("--------------\n");
               p++;  //跳40个字节
               q = (int *)p;
    }


    return;
}

9.6 数组的指针和指向数组的指针变量 - 3_第10张图片

int main()
{
    int (*p)[10];
    int a[3][10];    //数组名a 同样代表数组的首地址
    int i,j;
    for(i = 0;i < 3;i++)
    {
        for(j = 0;j < 10;j++)
        {
            a[i][j] = i+j;
        }
    }


    p = a;     //二维数组名可以直接赋值给数组指针
    int *q;
    q = (int *)p;
    for(i = 0;i < 3;i++)
    {
        for(j = 0;j < 10;j++)
        {
            printf("value = %d\n",*(*(p+i)+j));
        }
        printf("--------------\n");
               p++;  //跳40个字节
               q = (int *)p;
    }


    return;
}

9.6 数组的指针和指向数组的指针变量 - 3_第11张图片
9.6 数组的指针和指向数组的指针变量 - 3_第12张图片

四.多维数组的指针做函数参数

五.整理来源

整理至https://appd872nnyh9503.pc.xiaoe-tech.com/index的笔记

你可能感兴趣的:(C语言,c语言,指针)