- 数组名
数组名不代表整个数组中的全部数据,只能表示为数组中首元素的地址,就是一个指针常量。因为数组属于顺序表,逻辑上相邻的元素物理上也相邻。
(实参数组名表示该数组首元素的地址,而形参数组是用来接受实参传递过来的地址的)
用指针引用数组元素
-
如果指针 p 指向数组 a 的首元素,数组中序号为 i 的元素可以 *(p+i)这样表示,或者 *(a+i)也可
-
如果指针 p 已经指向了数组中的一个元素,那么 p+1表示同一个数组的下一个元素,
但是要理解的是,这里的 +1并不只是单纯的+1,而是一个数组元素所占用的字节数。p+1表示的地址实际上为p+1*d(d表示为一个数组元素所占用的字节数)
-
指向数组的指针变量可以带下标,
eg: p[i] 程序编译时,对下标的处理方法是转化为地址的,对p[i]处理为*(p+i) 但是必须知道指针变量的当前值是什么!比如指针变量p当前指向a[3],则p[2]不是表示a[2],而是a[5]。
-
*(p+i)与 p[i] 无条件等价
【注意,输入的时候,p[i]表示的是值,*p[i]:没有这个写法,输入时的正确写法:scanf("%d",&p[i]);用的是“&”,而不是写*p[i]】 通常表示一个数组元素时,eg: a[i],[ ]实际上是变址运算符,a[i]按a+i*d找到地址,然后找到值。
-
如果两个指针变量p1和p2都指向同一个数组
,则p2-p1表示两个地址之差除以单个数组元素的长度,比如整型数组,p2表示地址2020,存的是a[5],p2表示地址2012,存的是a[3],则p2-p1即为(2020-2012)/4=2,即表示p1与p2之间相差两个元素;p1+p2无意义
-
一定要弄清楚指针变量的当前值。
就比如对于一个数组,指针变量通过循环走到了最后一个元素,如果此时不对指针变量初始化,想要继续用这个指针循环输出数组元素,结果就会出现错误。但是编译可以通过。 -
关于形参数组和指针,就不要过多纠结,直接就看作地址就可以了
【不要忽略做形参的指针变量,之前自己还在那迷,总之就是指针也有实参形参的区别,就跟变量一样】 -
二维数组与指针
有个二维数组a[3][4],a表示的就是第0行的首地址,a+1 表示第1 行的首地址。
二维数组,可以看成是很多的一维数组,所以在定义指向一维数组的指针变量时,可以:int (*p)[4]; 4就是二维数组的列数。这句话就是说 p 是个指针变量,它指向有4个元素的一维数组,p的值就是这个一维数组的起始地址。
-
易混淆的点
int *p[n];//定义指针数组p,就是这个数组里的元素全都是指针,指向的还是整型的数据
int (*p)[n];//p是个指针,它指向的是有n个元素的一维数组
- 指针的指针
eg: char **p;//就类似二级间址