指针 与 地址 的关系
首先,我们要知道每一个存储在电脑的东西都有一个地址,一级指针,就是保留一种变量的地址,就像你把你家的地址用一张小纸条写好了然后给我,我就知道你在什么地方,如果别人想通过我找你,我就可以通过这个纸条给他,让他去找你(一级指针),还有一种情况,我在把我家的地址写一张纸条交给另一个人,别人可以通过另一个人得到我家的地址,来找我,找到我后,在从我这李得到你家的地址,然后来找你(二级指针);可能还有三级,四级,n级指针吧,就像线性代数的n维空间,还有很多不知道的慢慢的积累积累,
int a[3],a1[3][3],*p,*p1[3],**p2;
for(int i=0; i<3; i++){ //数组a[]的初始化;
a[i]=i;
}
cout<< &p <<endl; //查看一下指针p的地址
p2 = &p; //让二级指针p2指向一级指针p,即二级指针保留的是一级指针的地址;
cout<< p2 <<endl; //输出二级指针保留的数据,即一级指针的地址
//指具体的某个变量,要加地址运算符&
p = &a[0]; //一级指针指向数组第一个数据的地址,即一级指针保留的数据是a[0]的地址;
cout<<p<<endl;
p = &a[1]; //一级指针指向数组第一个数据的地址,即一级指针保留的数据是a[1]的地址;
cout<<p<<endl;
//数组名就是数组的首地址,也就是第一个元素的地址
p = a;
cout<<p<<endl;
cout<<&p<<endl;
int k=0;
for(int i=0; i<3; i++){
for(int j=0; j<3; j++){
a1[i][j]=k;
k++;
}
}
p = a;
for(int i=0; i<3; i++){
cout<<*p<<'\t'; //指针指向的变量的数据输出
p++; //指针指向下一个连续地址的元素
}
cout<<endl;
for(int i=0; i<3; i++){
p1[i] = &a[i]; //数组指针变量的每一个指针都指向一个元素
cout<<*p1[i]<<'\t';
}
指针的 地址和存储内容
//可以理解为变量都有地址和存储内容两种属性;
int a,*p1,**p2,***p3;
a = 6 ;
cout<<endl<<"-----1-----"<<endl;
cout<< "a="<< a << endl; //输出a的值
cout<< "&a=" << &a << endl; //输出a的地址
cout<<endl<<"-----2-----"<<endl;
cout<< "&p1=" << &p1 <<endl; //输出指针p1的地址
cout<< "&p2=" << &p2 <<endl; //输出指针p2的地址
cout<< "&p3=" << &p3 <<endl; //输出指针p3的地址
p1 = &a; //指针p1指向a, 即把a 的地址给p1存储内容;
p2 = &p1; //指针p2指向p1,即把p1的地址给p2存储内容;
p3 = &p2; //指针p3指向p2,即把p2的地址给p3存储内容;
cout<<endl;
cout<<"p1 = &a;"<<endl;
cout<<"p2 = &p1;"<<endl;
cout<<"p3 = &p2;"<<endl;
cout<<endl<<"-----3-----"<<endl;
cout<< "p1=" << p1 <<endl; //输出p1的存储内容
cout<< "p2=" << p2 <<endl; //输出p2的存储内容
cout<< "p3=" << p3 <<endl; //输出p3的存储内容
p1 = &a;
p2 = &p1;
p3 = &p2;
cout<<endl<<"-----4-----"<<endl;
cout<< "*p1=" << *p1 <<endl; //输出p1的存储内容的存储内容,即a 的存储内容,即a的值;
cout<< "*p2=" << *p2 <<endl; //输出p2的存储内容的存储内容,即p1的存储内容,即a的地址;
cout<< "*p3=" << *p3 <<endl; //输出p3的存储内容的存储内容,即p2的存储内容,即p1的地址;