c语言指针进阶

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、指针是什么?

百度百科上是这么说的:指针也就是内存地址指针变量是用来存放内存地址的变量,在同一CPU构架下,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。有了指针以后,不仅可以对数据本身,也可以对存储数据的变量地址进行操作。

指针本身在32位系统中占4个字节,64位系统中占8个字节。(指针的大小与类型无关)
举个最简单的的例子:

int a = 1;
int* p = NULL;		//定义一个空指针
p = &a;				//指针存放变量a的地址

int a = 1;这个动作实际是在内存中开辟了一块空间。&取a的内存地址,将a的地址存放到p中。
在这里插入图片描述假设变量a的占了(0x00000001-0x00000004)四字节,那p就存放了a的首地址0x00000001。当然,你也可以理解为p指向了变量a的首地址,毕竟指针嘛。

二、指针的使用

  • 上面的例子简化一下:
int a = 1;
int* pInt = &a;

修改变量a对应地址的值(修改变量a的值):

*p = 2;					//修改p存的地址的值
  • 结合数组使用:
int arr[] = {0,1,2,3,4};
int* p = arr;		//将数组首地址给p

printf("%d", *p);	//以指针的方式输出数组第一个位置的0(*取值符)

当你相当了解数据在内存中的结构时,可以这么玩:

printf("%d", *(p+1));//让p偏移1个位置,因为p是int类型的,偏移4个字节
//输出1

注意: 如果是*p+1,那就是先算优先级高的 * 号

以数组的方式使用:

printf("%d", p[1]);		//将p看成arr
//输出1		

拓展:野指针
野指针就是指针指向的位置是不可知的,(随机性的丶不正确的丶没有明确限制的)
使用未初始化的指针会出现问题:

int* p;
*p = 1;		//error
  • 为了避免这种情况出现,在初始化时应该让指针指向空:
int* p = NULL;
  • 在使用完指针,或者释放完指针时也应该置空。
    这样我们在使用指针时就可以很方便的知道指针是否有确定目标:
if(p != NULL)
{
//不为空则执行
}
  • 有时指针在不注意的情况下,被我们指向了奇怪的位置,比如,越界。
  • 有时还会被指向局部变量的地址,函数在执行完就会被释放,里面的变量也会一同释放。

最后

如果文章有什么错误的地方,或者有什么补充,欢迎各位指正讨论。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小冯爱编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值