之前学指针的时候,自以为学的很精通了。后面在百度面试、牛客刷题时才发现自己对指针领悟的蹩脚。
写此贴告诉自己,stay hungry,stay foolish。
首先,应该明白指针包含的三个信息:
(1)内存地址(首地址)
(2)截取的长度(知道长度,就知道尾地址)
(3)数据的解析方式
其次,一级指针和二级指针:
(1)一级指针可以用来管理一维数组
(2)二级指针改变一级指针指向,还可以管理指针数组,进而管理二维数组。
第三,指针和数组:
(1)一维数组
int a[5]={1,2,3,4,5};
int *p=a;//数组名是指向元素的指针 助记:a[1]=*(p+1)
int (*p)[5]=&a;//数组名取地址是指向数组的指针(行指针)
//&a a &a[0] 作为指针,三者的地址相同,但是底层数据的截取长度不同
sizeof(a);// 求数组的大小
//数组名做形参,会退化为指针
//指针是分为指向常量的指针 const int * p 和常量指针 int * const p;
//c++ 中 顶层常量属性可以不匹配,但是底层常量中,底层常量可以接收底层非常量内存地址,反之不可以
const char aa[2] = { '2','3' };
char *ppp = aa;//底层常量属性不匹配,报错
const char *ppp=aa;//ok
char *pp = "123";//????
char ch[2]={'3','4'};
const char * P =ch;//ok
(2)二维数组
int a[2][4]={1,2,3,4,5,6,7,8};
int (*p)[4]=a;
int (*p)[2][4]=&a;
//a是元素指针,二维数组元素就是行指针 所以a行指针 助记: *(*(p+1)+3)=a[1][3]
//&a是二维数组指针
//二级指针是指向指针数组的指针,可以管理二维数组(常作为malloc的接收值),但是不可以接收二维数组名
第四,指针数组,指向数组的指针,常量指针,指向常量的指针,函数指针,函数指针做形参或者返回值的函数
注意以上概念的辨析。