C++指针的几个注意点
https://blog.csdn.net/simonyucsdy/article/details/82685021
1、指针声明语句。
例如:
int a=10;
int *ptr=&a;
其中第二句代码变量名是ptr,而整个int *是指明变量类型,即ptr的变量类型是整数型的指针,ptr的值是a的地址。
2、命名指针时做好明确指向的习惯
char *getPtr(){
//指针不能理解为变量,先声明然后直接赋值会出现该程序访问不到而报错
char *p;
p = (char *)'a';
cout << *p <<"的地址是"<<p<< endl;
return p ;
}
至于为什么,大家可以试着猜一下。
3、指针和数组
一维数组与一维数组
int a[5]={0,1};
这个时候单独一个字母a的值是数组首元素的地址。
char *getPtr(){
char a[10] = {'k','j'};
char *p;
p = a;
cout << *p <<"的地址是"<<(int *)p<< endl;
printf("%d", p);
return p ;
}
输出如下(008FFCF8的10进制就是9436408)
k的地址是008FFCF8
9436408
4、二维数组与二维指针
通过上图就可以形象地看出,二维数组中,a[0]的值是第0行第0个元素的地址,而a的值是存放a[0]的地址,一句话说,a就是a[0][0]元素地址的地址。后面一个就是讲双重指针,或者个人理解为地址的地址。
void two_dimensional_array()
{
int a[4][3] = { {1,2,3},{4,5,6},{7,8,9},{10,11,12} };
cout << a[0][0] << "的地址是: " << a[0] <<"也可以是:"<<*a<< endl;
cout << a[1][1] << "也可以表示为: " << *(*(a + 1) + 1) << endl;
}
输出结果如下
1的地址是: 010FF64C也可以是:010FF64C
5也可以表示为: 5
5、二重指针
有了上面的基础,二重指针就很好理解了,还是用上面那个二维数组来理解。
void two_dimensional_array()
{
int a[4][3] = { {1,2,3},{4,5,6},{7,8,9},{10,11,12} };
//单个二重指针表示
int *b = &a[0][0];
int **p1 = &b;
cout << a[0][0] << "的值: " << **p1 << " 地址是: " << *p1 << endl;
//指针数组表示
int *p2[4] = {a[0],a[1],a[2],a[3]};
cout << a[0][0] << "的值: " << **p2 << " 地址是: " << *p2 << endl;
}
输出结果如下
1的值: 1 地址是: 00B4FB1C
1的值: 1 地址是: 00B4FB1C
指针进一步应用
https://blog.csdn.net/logan_520/article/details/124085602
指针和引用的区别和使用场景
https://blog.csdn.net/weixin_46810858/article/details/115654266