数组与指针
指向数组的指针
一、数组与指针的关系:
1.数组:
数组名表示数组的首地址——数组名是一种指针;
数组名表示的地址不能改变——指针常量。
2.数组的指针
=数组的起始位置=与数组名表示的指针相同 =数组的第一个元素的地址相同
二、数组和指针用法区别:
1.定义指针时:只分配一段用来存放地址的空间,没有分配存放数据的空间;
2.定义数组时:为所以元素分配相应的连续的存储空间,但没有存放地址的空间。
三、指针对数组的引用:
1.指针指向数组的首地址;数组名代表数组首元素的a[0]地址,即相当于&a[0];
例: int a[4];
(1) &a 是“指向数组”的指针;
&a+1将跨越16个字节:数组a四个元素,每个元素占4个字节
&a相当于管辖范围“上升”一级;
注:&a 指向整个数组,a指向首元素,但是所指向的地址相同;
(2)* a 是数组的第一个元素a[0]; 即*a等价于a[0];
*a 相当于管辖范围“下降”一级;
2. a==*p==a[0]
a[i]==*(p+i)
3.利用指针引用数组
1.定义
数组int a[10]; 指针 int*pointer;
2.赋值
pointer=a; 等价于pointer=&a[0];
3.数组访问:
pointer+i; 等价于a=i; 等价于&a[i];
*(pointer +i); 等价于*(a+i)等价于 a[i];
注意易错:
指针运算:int *p=&a[0];
1. a++: 没有意义,数组名的值不能改变,是非法操作;
p++:p + / - 指针所指向的存储单元所占的字节数加减;
p++为下一个元素的地址。
例题:
输出结果为 5.
分析:*p =a+3 ——>*p=a[3]
p[2] ——>p[0]=a[3],p[2]=a[6]
2.指针做加减运算一定要注意有效范围
int a[5]; int *iptr=&a[1]; iptr --; //指向&a[0] *iptr = 3; //a[0]=3 iptr--; //指向&a[-1],超出范围,危险 *iptr = 6; //危险
四、二维数组指针
1.定义:int (*p)[4];
先定义一个指向a的指针变量p;数组类型为int [4];即a所包含的每一个一维数组的类型。即p指向一个“包含4个int型元素的一维数组”
2.等价关系
(1) P+i等价于&a[i];
(2) *(p+i)等价于a[i];
(3) *(p+i)+j 等价于a[i]+j 等价于&a[i][j];
(4) *(*(p+i)+)等价于 a[i][j];
——> a+1行加一即a[ 1 ],*(a)+1才是列的移动即a[0][1](地址加一)
3.数组表