p++,p--就是将指针地址值加1,这个1不是指1个字节,而是指1个p指针类型长度。比如int *就是向后移动4个字节。指向下一个整型。
p指向数组的话,就是逐个遍历每个数组元素
首先,数组中各个元素的地址是连续的。
for(p=a; p<a+5; p++)
p=a 将a的地址赋值给p,数组a的地址即为第一个元素的地址,此处的p=a相当于p=&a[0],所以此时p所指向的字符串是ABCDE
循环p++即p的地址值+1,相当于
p=&a[1] p所指向的字符串是BCDE
p=&a[2] p所指向的字符串是CDE
p=&a[3] p所指向的字符串是DE
p=&a[4] p所指向的字符串是E
本体的for循环等同于如下:
for (int i = 0; i < 5; i++) {
p = &a[i];
printf("%s\n", p);
}
最后,对于指针p的+-即其地址的+-
下面是我的理解,供参考:
字符串的指针,一般就是字符指针指向字符串里面某个字符的位置,而数组名一般就是首元素的地址,如程序里的a就是指向字符串“ABCDE”里元素字符'A'的地址,程序里的p=a,p也是指向字符串里字符'A'的位置。
然后printf函数格式字符串%s打印某个字符指针指向的字符串,一般就是从字符指针指向的字符位置开始打印 ,直到遇到字符串结束符'\0',而双引号括起来的字符串的结束一般都带有个'\0' ,所以for循环里面用%s打印p指向的位置,就随p指向的字符位置不同而从不同字符开始打印,直到字符串结尾的空字符'\0',
第一次p=a, 从字符'A'开始直到‘E’结束,打印“ABCDE”,第二次,p++后,指向字符串第二个字符'B',所以从字符‘B’开始直到'E’结束,所以打印"BCDE",如此,直到for循环结束。
所以就依此打印 :
ABCDE
BCDE
CDE
DE
E
#include <stdio.h>
int main(void){
char a[] = "ABCDE";
char * p = NULL;
for(p=a;p<a+5;p++){
printf("%s\n",p);
}
}