- 指针的运算在数组中才有意义
int *p; p++,一定是在一片连续的区域才有意义,当然越界也会带来诸多问题。
void main() { int num = 10; int *p = #//这根本无界可言 p++; printf("%d ",*p); getchar(); }
输出结果:
#include<stdio.h> #include<stdlib.h> #include<Windows.h> void main() { int num[10] = {1,2,3,4,5,6,7,8,9,10}; int *a = num; for (int *p =num+9; p>=a;p--) { printf("%d ", *p); } getchar(); }
#include<stdio.h> #include<stdlib.h> #include<Windows.h> void main() { int num[10] = {1,2,3,4,5,6,7,8,9,10}; int *a = num; a = a + 3;//后移3个元素,到元素4 printf("%d ",*a);//4 a = a - 2;//从元素4前移2个单位到元素2 printf("%d ", *a);//2 getchar(); }
输出结果:
- 指针可以比大小,所谓大的地址上比较靠后,小的地址比较靠前,意义仅在于此,当然还得是在一个数组里的两个指针比较才有意义
- *p++=====》*(p++)
#include<stdio.h> #include<stdlib.h> #include<Windows.h> void main() { int num[10] = {1,2,3,4,5,6,7,8,9,10}; int*p = num; for (int *p = num + 9; p >= num;p--) { printf("值是----%d,地址是----%p ",*p,p); } printf("%d,地址是:%p ", *p++,p);//运算过程,*(p++) 1.p++,返回p,2.运算*p 3.p++ printf("值是%d,地址是%p ", *p, p); getchar(); }
输出结果:
#include<stdio.h> #include<stdlib.h> #include<Windows.h> void main() { int num[10] = {1,2,3,4,5,6,7,8,9,10}; int*p = num; for (int *p = num + 9; p >= num;p--) { printf("值是----%d,地址是----%p ",*p,p); } printf("%d,地址是:%p ", *++p,p);//运算过程,*(++p ) 1.++p,从数组首元素地址推进到第一个元素的地址a[1],2.返回地址处于a[1]1的值 printf("值是%d,地址是%p ", *p, p); getchar(); }
输出结果:
#include<stdio.h> #include<stdlib.h> #include<Windows.h> void main() { int num[10] = {1,2,3,4,5,6,7,8,9,10}; int*p = num; for (int *p = num + 9; p >= num;p--) { printf("值是----%d,地址是----%p ",*p,p); } ++p; printf("%d,地址是:%p ", *p,p);//运算过程,*(p++) 1.p++,返回p,2.运算*p 3.p++ getchar(); }
输出结果:
- 指针相减:意义-----两个元素相隔的距离----当然要求是相同类型的元素地址;指针之差和指向的数值也没有任何意义
#include<stdio.h> #include<stdlib.h> #include<Windows.h> void main() { int a = 3, b = 4; int *p = &a; int *q = &b; printf("a,b两元素相隔距离%d ", q-p); getchar(); }
输出结果:
我们观测到两个变量的地址,windows操作系统下,打开计算器,选择程序员型工作模式,选择十六进制模式,用EE0减去ED4,得出结果后转十进制算出了12
当然相隔3个单位,每个整型长度为4,那么3个单位就相差12个字节
在数组中,指针相减可以有助于帮我们定位元素在数组中所处位置
#include<stdio.h> #include<stdlib.h> #include<Windows.h> void main() { int a[10] = {1,2,3,4,5,6,7,8,9,10}; int *p1 = &a[2]; int *p2 = &a[9]; int *p3 = p1 + 4; printf("p3的地址%p,代表元素%d ",p3,*p3); printf("p1和p2地址相差%d单位 ", p2-p1); getchar(); }
输出结果: