■两个同类型的指针相减 。实际结果由指针所指向的类型来定。例如: int *p,*q; .q-p./结果为:(q的值-p的值)/sizeof(int) 。只有跟数组结合使用才有实际意义。例如: int a[10]; int *p =&a[0]; int *q &a[3]; cout<<q-p<<endl;/输出3
◼ 两个同类型的指针相减 • 实际结果由指针所指向的类型来定。例如: int *p,*q; ...... ... q-p ... //结果为:(q的值-p的值)/sizeof(int) • 只有跟数组结合使用才有实际意义。例如: int a[10]; int *p = &a[0]; int *q = &a[3]; cout << q-p << endl; //输出3
■两个同类型的指针比较 。比较它们所对应的内存地址的大小。例如: int *p,*q; if(p<q).…/比较p和q中存储的地址的大小 。只有跟数组结合使用才有实际意义。例如: int a[10],sum; for(p=&a[0],q=&a[9],sum=0;p<=q;p++) sum +*p; ■为什么不按下面的做法? for (int i=0,sum=0;i<10;i++) sum +a[i]; 从执行效率上考虑!
◼ 两个同类型的指针比较 • 比较它们所对应的内存地址的大小。例如: int *p,*q; ...... if (p < q) ...... //比较p和q中存储的地址的大小 • 只有跟数组结合使用才有实际意义。例如: int a[10],sum; ...... for (p=&a[0],q=&a[9],sum=0; p<=q; p++) sum += *p; ◼ 为什么不按下面的做法? for (int i=0,sum=0; i<10; i++) sum += a[i]; ◼ 从执行效率上考虑!
指针的输出 int x=1; int *p=&x; cout<<*p;/输出p指向的值(x的值) cout<<p;/输出p的值(x的地址) 特殊情况: char str[]="ABCD"; char*q=&str[0];/或者char*q=str; cout<<*q;/输出q指向的字符:A cout<<q;/输出q指向的字符串:ABCD Cout<<(Void*)q/输出p的值,即字符串"ABCD"的内存首地址
int x=1; int *p=&x; cout << *p; //输出p指向的值(x的值) cout << p; //输出p的值(x的地址) ◼ 特殊情况: char str[]="ABCD"; char *q=&str[0]; //或者char *q=str; cout << *q; //输出q指向的字符:A cout << q; //输出q指向的字符串:ABCD cout << (void *)q //输出p的值,即字符串"ABCD"的内存首地址 指针的输出
下面指针的用法好吗? int x=0,y; int *p=&x; *p=1; y=*p+3*X; ■不好!程序的可读性很差!
下面指针的用法好吗? int x=0,y; int *p=&x; *p = 1; y = *p+3*x; ◼ 不好!程序的可读性很差!
指针的主要用途 ·作为函数形参的类型 ■ 访问动态变量 高效访问数组元素
指针的主要用途 ◼ 作为函数形参的类型 ◼ 访问动态变量 ◼ 高效访问数组元素