指针陷阱

之前学指针的时候,自以为学的很精通了。后面在百度面试、牛客刷题时才发现自己对指针领悟的蹩脚。

写此贴告诉自己,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的接收值),但是不可以接收二维数组名

第四,指针数组,指向数组的指针,常量指针,指向常量的指针,函数指针,函数指针做形参或者返回值的函数

注意以上概念的辨析。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值