数组与指针
数组名(不包括形参数组名,形参数组并不占用实际内存单元)代表数组首元素(即序列号为0的元素)的地址。
int a[10];
int *p;
p=&a[0]=a; 把数组名a的首元素的地址赋给指针变量p;
*p=1; 表示将1赋给p当前所指向的数组元素;
p+1 ->指向同一个数组的下一个元素,此处不是简单的加1,而是根据p指针所属的数据类型,加上一个单位的步长,例如数组元素是float型,每个元素占4个字节,则p+1指p的值加上四个字节。
(1) 如果p=&a[0]=a;则p+i = a+i =&a[i]是a[i]的地址;
(2) *(p+i)或*(a+i)是p+i或者a+i所指向的数组元素,即a[i];
(3) 指向数组的指针变量也可以带下标,如p[i]和*(p+i)等价;
引用数组元素,可以使用:
(1) 下标法,如a[i]形式;
(2) 指针法,如*(a+i)或*(p+i),其中a是数组名,p是指向数组元素的指针变量;
注:数组名a 代表数组首元素的地址,a是一个指针常量,a的值在程序运行过程中是固定不变的,所以a++ 得操作是无法实现的
*p++,由于++和*同优先级,结合方向是自右向左,则等价于*(p++)
*(p++)作用:先得到P指向的变量的值(即*p),再使p+1=p;
例如:
For(i=0;i<10;i++,p++)
Printf(“%d”,*p);
等价于 for(i=0;i<10;i++)
Printf(“%d”,*p++);
*(p++)与*(++p)区别?
前者先取*P的值,然后使p加1;后者先使p+1,再取*p;
例:若p的初值为a(即&a[0]);则*(p++)为a[0],而*(++p)为a[1];
注:实参数组名代表一个固定的地址,或者说是指针常量,在运行过程中是固定不变得,
但形参数组并不是一个固定的地址值,而是作为指针变量,在函数调用开始时,他的值等于是参数组首元素的地址,在函数执行期间,他可以再被