指针的背后

本文深入探讨了C语言中的指针,解释了指针存在的原因,包括CPU对间接寻址的需求。讨论了左值和右值的概念,并阐述了指针作为变量的本质。介绍了指针的定义、绑定和解引用操作。此外,还提到了如何防止野指针,以及const关键字在指针中的应用,区分了不同const修饰形式的含义。最后,讨论了指针初始化和避免野指针的方法。
摘要由CSDN通过智能技术生成

为什么有指针

        汇编中,CPU访问外部内存必须使用汇编中的间接寻址,c语言要访问内存,因此也必须要能实现间接访问,所以有了指针。

左值、右值

        放在“=”左边的叫左值,右边的是右值;

        左值变量,编译器认为是变量在内存的空间(格子);a=1;将1放入a的格子里;

        右值变量,编译器认为是内存(格子)里的数;a=b,将b的内容放入a的格子里;

指针与变量

        指针的实质还是变量,全称指针变量;

        指向任何类型的指针变量,本身是一个int型,内部永远都是存储地址。

        如P=(int *) 4;将以地址0x04开头的连续4个地址(0x04、0x05、0x06、0x07),强制转换成一个指针变量,且这个指针用来指向int型变量;

使用指针3部曲

  • 定义指针:int  *p;
  • 绑定指针:P=&a 或 P=(int *)0x4;
  • 解引用: *p=0x321;或a=*p;//与汇编的间接访问相同;

指针的符号 *

        在指针中“*”有两种含义,变量定义时添加*,用来声明一个指针变量。解引用时*代表间接寻址的标识符。定义指针变量 int  *p 这句话int与*是一个整体,p是另外一个整体。int  *p;int  *  p;int*  p;int*p;这4种方法其实都可以,但是在同时定义多个指针变量时不一样,如int* p1,p2,则P1是指针变量,p2是int型常量,所以需要写成 int  *p 也是常规写法。解引用 *p = a;  a=*p或a= * p;*p是一个整体,不能分开理解。

指针的符号 &

取地址符;定义常量时,编译器自动分配了地址,但是这个地址程序员不知道,正常访问变量时,编译器会把地址里的内容进行读写,如果加了变量前&,编译器就会把变量在内存中的地址读出来。如 p = &a;&a是一个整体,不可分开理解。就是指a的地址;

指针定义并初始化

int a=32;int  *p=&a;

野指针的预防

  1. 定义指针时将初值设为NULL(0)
  2. 用前判断是否等于NULL
  3. 用完后将指针指向NULL

const 与指针

        cosnt修饰变量是常量(不可被修改),指针也是变量,当然可以被修饰;

        cosnt 的意义只是告诉读者和编译器,该变量不会被修改。其实可间接手段修改。cost与变量的结合有多种方式,其各种组合的修饰对象不同,主要是看const与谁先结合。

int * const p  ;  //const 紧跟p,说明指针本身不能被修改。
const int *p ;   //const后面是int,说明p可被修改,指向的变量不能被修改。
int const *p;    // const后面是*,说明p可被修改,指向的变量不能被修改。
const int * const p

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值