第九章 指针
第六节 数组的指针和指向数组指针的指针变量-3
1. 回顾二维数组和多维数组的概念
a[3][4]二维数组
a[7][8][9], 三维数组, 排列方式a[0][0][0]…a[0][0][9], a[0][1][0]…最右侧维度变化最快,最左侧变化最慢
多维数组以此类推…
2. 指向多维数组的指针和指针变量的探究
#include<iostream>intmain(){//可以把a看成是一个一维数组,这一个一维数组有三个元素, a[0], a[1], a[2]// 每个元素又是一个包含4个元素的一维数组//数组名a,同样代表数组首地址, 假设a[0]的地址在1000, a[1]的地址是1016, a[2]的地址是1032inta[3][4];int*p;p=(int*)a;//强制类型转换p=(int*)(a+1);// 代表第一行首地址,每行有四个元素,每个元素占4个字节,a+1要跳过16个字节// a[0], a[1], a[2]就是个一维数组名,c语言规定数组名代表数组的首地址//也就是说a[0] == &a[0][0]p=a[0];p=a[1];// 第0行第一列元素首地址p=&a[0][1];//也可以使用p= a[0]+1;return0;}一些推论(假设数组首地址为1000)
a[0] 等价于 *a, 都是数组首地址, 则地址为1000
a[0]+1 等价于 *a+1,等价于 &a[0][1], 也就是地址为(1004)
a[1] 等价于 *(a+1), 等价于1016
a[1]+2 等价于 *(a+1)+2, 等价于 &a[1][2], 地址也就是1024
*(a[0]+1) 等价于 a[0][1]
*(a[1]+2) 等价于 a(*(a+1)+2), 第一行第二列元素值(已哭晕!!)
a[i]的性质
如果是一维数组的话,是代表值,是占用实际内存的
如果是多维数组的话,是代表地址,a[i]和&a[i]的地址值是一样的
代码演示
#include<iostream>intmain(){inta[3][4];inti,j;for(i=0;i<3;i++){for(j=0;j<4;j++){a[i][j]=0;}}int*p;p=(int*)(a+1);//第1行首地址*p=56;p++;*p=88;for(i=0;i<3;i++){for(j=0;j<4;j++){printf("a[%d][%d]: %d ",i,j,a[i][j]);}}return0;}3. 指针数组和数组指针
a) 指针数组
#include<iostream>intmain(){// 首先这是个数组,数组中有4个元素,每个元素都是个指针,// 所以这相当于定义了4个指针变量// 指针数组int*p[4];//能引用的下标是0-3inta[3][4];inti,j;for(i=0;i<3;i++){for(j=0;j<4;j++){a[i][j]=100;printf("a[%d][%d]: %d ",i,j,a[i][j]);}}printf("\n");p[0]=&a[0][0];p[1]=&a[0][1];p[2]=&a[0][2];p[3]=&a[0][3];for(i=0;i<4;i++){printf("the value of *p[%d]: %d ",i,*(p[i]));}return0;}b) 数组指针
不太好理解,使用不是很多
实例代码1
#include<iostream>intmain(){// 数组指针,注意括号//这是一个指针变量,用来指向10个元素得的一维数组int(*p)[10];inta[10];for(inti=0;i<10;i++){a[i]=i;}p=&a;//要用取地址符,否则编译报错int*q;q=(int*)p;for(inti=0;i<10;i++){printf(" value: %d",*q);q++;}return0;}- 实例代码2
#include<iostream>intmain(){int(*p)[10];inta[3][10];inti,j;for(i=0;i<3;i++){for(intj=0;j<10;++j){a[i][j]=i+j;}}p=a;//二维数组名可以直接赋值给数组指针int*q;q=(int*)p;for(i=0;i<3;i++){for(intj=0;j<10;++j){printf(" value: %d ",*q);q++;}printf("\n***************************\n");p++;}return0;}4. 多维数组的指针做函数参数
- 实际应用,建议参考前面的实例