#指针加减整数
示例:通过指针±整数操作,实现数组中各个元素的输出。
#include<stdio.h>
#define N_VALUES 5
int main(){
float values[N_VALUES];
float *vp;
//指针±整数操作
for(vp=&values[0];vp<&values[N_VALUES];){
*vp++=0;
//等价于
//*vp=0;
//vp++;
}
//打印
int i=0;
for(i=0;i<N_VALUES;i++){
printf("values[%d]=%d\n",i,values[i]);
}
return 0;
}
运行结果:
values[0]=0
values[1]=0
values[2]=0
values[3]=0
values[4]=0
--------------------------------
Process exited with return value 0
Press any key to continue . . .
等价于
#include<stdio.h>
#define N_VALUES 5
int main(){
float values[N_VALUES];
float *vp;
//指针±整数操作
for(vp=&values[0];vp<&values[N_VALUES];vp++){
*vp=0;
}
//打印
int i=0;
for(i=0;i<N_VALUES;i++){
printf("values[%d]=%d\n",i,values[i]);
}
return 0;
}
运行结果:
values[0]=0
values[1]=0
values[2]=0
values[3]=0
values[4]=0
--------------------------------
Process exited with return value 0
Press any key to continue . . .
#指针减指针
示例1:通过指针减指针的关系运算,求字符串的长度。
#include<stdio.h>
int my_strlen(char* str);
int main(){
char arr[] = "bit"; //bit\0
int len = my_strlen(arr);
printf("len=%d\n",len);
return 0;
}
int my_strlen(char* str){
char *start = str;
char *end = str;
while(*end != '\0'){
end++;
}
return end-start;
}
运行结果
len=3
--------------------------------
Process exited with return value 0
Press any key to continue . . .
示例2:通过指针减指针的关系运算,求数组的长度。
#include<stdio.h>
int main(){
char arr[10] = {1,2,3,4,5,6,7,8,9,10};
printf("%d\n",&arr[9]-&arr[0]);
return 0;
}
运行结果
9
--------------------------------
Process exited with return value 0
Press any key to continue . . .
分析:通过上述例子可知,指针减去指针得到的是中间元素的个数。
#指针的关系运算
示例:通过指针的关系运算,实现数组中元素的赋值。
#include<stdio.h>
#define N_VALUES 5
int main(){
float values[N_VALUES];
float *vp;
//指针±整数操作
for(vp=&values[N_VALUES];vp>&values[0];){
*--vp=0;
//等价于
//vp--;
//*vp=0;
}
//打印
int i=0;
for(i=0;i<N_VALUES;i++){
printf("values[%d]=%d\n",i,values[i]);
}
return 0;
}
运行结果:
values[0]=0
values[1]=0
values[2]=0
values[3]=0
values[4]=0
--------------------------------
Process exited with return value 0
Press any key to continue . . .
方法2
#include<stdio.h>
#define N_VALUES 5
int main(){
float values[N_VALUES];
float *vp;
//指针±整数操作
for(vp=&values[N_VALUES];vp>&values[0];vp--){
*vp=0;
}
//打印
int i=0;
for(i=0;i<N_VALUES;i++){
printf("values[%d]=%d\n",i,values[i]);
}
return 0;
}
运行结果:
values[0]=0
values[1]=0
values[2]=0
values[3]=0
values[4]=0
--------------------------------
Process exited with return value 0
Press any key to continue . . .
分析:实际上,上述两种方式绝大多数的编译器是可以实现上述任务的的,然而应当避免方法2这样写,因为标准并不保证它是可行的。
标准规定:允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但不允许与指向第一个元素之前的那个内存位置的指针及逆行比较。
----------END----------