#include<iostream>
using namespace std;
int main(){
unsigned int a = 5;
unsigned int *pint = NULL;
cout<<"&a = "<<&a<<endl<<"a = "<<a<<endl;
cout<<"&pint="<<&pint<<endl<<"pint="<<pint<<endl;
cout<<"&(*pint)="<<&(*pint)<<endl;
cout<<"*(&pint)="<<*(&pint)<<endl<<endl;
pint =&a;
cout<<"&a = "<<&a<<endl<<"a = "<<a<<endl;
cout<<"&pint="<<&pint<<endl<<"pint="<<pint<<endl;
cout<<"&(*pint)="<<&(*pint)<<endl;
cout<<"*(&pint)="<<*(&pint)<<endl<<endl;
*pint = 10;
cout<<"&a = "<<&a<<endl<<"a = "<<a<<endl;
cout<<"&pint="<<&pint<<endl<<"pint="<<pint<<endl;
cout<<"&(*pint)="<<&(*pint)<<endl;
cout<<"*(&pint)="<<*(&pint)<<endl<<endl;
return 0;
}
输出结果如下图所示:
首先定义了无符号整型变量a和指向整形变量的指针pint;
先输出a的地址以及a的值;
最开始指针变量的值为NULL,即不指向任何变量。
且指针的存放位置与变量a的存放位置相差4个字节(整型);
因此pint的值为00000000;
然后令pint指向a;
输出a的地址以及a的值;
在输出pint的值可见pint中存放的是变量a的地址;
将*pint看作是一个整型变量,那么&(*pint)就是对改整型变量取地址,因此pint始终等于&(*pint)。
将指针pint指向变量a后,pint就可以看作变量a,在程序的后半部分将10赋给pint,即可以看作是将10赋给变量a;
因此再输出a的值,a的值就发生了变化;
&* pint:取地址符和指向运算符的优先级相同,按照从右向左的方向结合。对pint先进行一次指向运算即为该指针所指向的变量,再取地址即为pint中存储的值(或变量的地址);
*&pint:先对指针取地址,再指向运算,结果为pint这个指针存储的值。
下面是数组与指针常用:
#include<iostream>
using namespace std;
int main(){
int ary[10]={0,1,2,3,4,5,6,7,8,9};
int *p;
p=ary;
cout<<"p="<<p<<endl;
cout<<"*p="<<*p<<endl;
cout<<"p+1="<<p+1<<endl;
cout<<"p+6="<<p+6<<endl;
cout<<"*p+6="<<*p+6<<endl;
}
运行结果:
首先定义了一个大小为10的一维数组和整型变量指针,令p指向数组的头部,输出p输出的是数组开始的地址,指向操作后为输出的这个地址处所存的值。p与p+1差4个字节,见程序输出结果。