- 普通的语句
int a = 1;
内存中地址为&a的地方存储了值1。
由于一般(无指针)语句不需要知道地址&a,也并不会使用到,所以对开发者“不可见”。在编程时,看起来就像是变量a等于1,操作变量a,就可以实现对该值的改变(实际上是在操作地址&a的值,而开发者看到变量a始终对应地址&a的值)。
- 数组
int is[] = {1, 2, 3, 4, 5};
数组存放在内存地址&is~&(is+4),每个地址存储了一个值。
is与&is都对应数组的起始地址,两者相等,称之为指针,指向数组第一个数据。
对于指针可以通过*is取到数组第一个值1,同理*(is+1)取到2……
这样编写较为麻烦,可以(语法糖)简写 *is: is[0],*(is+1):is[1]……
- 指针
int* p = is;
指针通过int*定义,is为数组起始地址,那么指针p指向数组。
*p访问到is[0],p[0]也访问到is[0];*(p+1)、p[1]访问到is[1]……
当我们想通过地址来操纵数据时才需要指针,指针p代表内存中地址,*p则是该内存地址中存储的值。
对于指针p,*p就相当于普通变量a/b。
代码:
int a = 1;
int b = 10;
cout<<"a = "<<a<<" &a = "<< &a;
cout<<"\nb = "<<b<<" &b = "<< &b;
int is[] = {1, 2, 3, 4, 5};
cout<<"\nis = "<<is<<" &is="<<&is << " *is="<<*is;
cout<<"\nis[0] = "<<is[0] <<" &is[0] = "<<&is[0];
cout<<"\nis[1] = "<<is[1] <<" &is[1] = "<<&is[1];
int* p = is; // type of is : int*
//int m = is; //error: invalid conversion from ‘int*’ to ‘int’
cout<<"\n*p = "<<*p<<" p="<<p<< " p[0]="<<p[0]<<endl;
输出:
a = 1 &a = 0x7fff8cb86110
b = 10 &b = 0x7fff8cb86114
is = 0x7fff8cb86120 &is=0x7fff8cb86120 *is=1
is[0] = 1 &is[0] = 0x7fff8cb86120
is[1] = 2 &is[1] = 0x7fff8cb86124
*p = 1 p=0x7fff8cb86120 p[0]=1