> 文章列表 > 9.6 数组的指针和指向数组的指针变量 - 3

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

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
9.6 数组的指针和指向数组的指针变量 - 3
内存中:
9.6 数组的指针和指向数组的指针变量 - 3
a[2][3][4];

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

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

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

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

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];   //地址:0x0042f7ccp = a[1];   //地址:0x0042f7dcreturn;
}

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

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

int main()
{int a[3][4];    //数组名a 同样代表数组的首地址int *p;p = &a[0][1];   //地址:0x000ffb30p = a[0] + 1;   //地址:0x000ffb30return;
}

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

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] = 56p++;  //走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

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

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

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
9.6 数组的指针和指向数组的指针变量 - 3

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

五.整理来源

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