Day 11 指针初学

指针的概念

计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如 int 占用4个字节,char 占用1个字节。为了正确地访问这些数据,必须为每个字节都编上号码,就像门牌号、身份证号一样,每个字节的编号是唯一的,根据编号可以准确地找到某个字节

      我们将内存中字节的编号称为地址Address)或指针Pointer)(即地址就是指针。地址从 0 开始依次增加,对于 32 位环境,程序能够使用的内存为 4GB,最小的地址为 0,最大的地址为 0XFFFFFFFF

一切都是地址

C语言用变量来存储数据,用函数来定义一段可以重复使用的代码,它们最终都要放到内存中才能供 CPU 使用。数据和代码都以二进制的形式存储在内存中,计算机无法从格式上区分某块内存到底存储的是数据还是代码。当程序被加载到内存后,操作系统会给不同的内存块指定不同的权限,拥有读取和执行权限的内存块就是代码,而拥有读取和写入权限(也可能只有读取权限)的内存块就是数据

      CPU只能通过地址来取得内存中的代码和数据,程序在执行过程中会告知 CPU 要执行的代码以及要读写的数据的地址。CPU 访问内存时需要的是地址,而不是变量名和函数名!变量名和函数名只是地址的一种助记符当源文件被编译和链接成可执行程序后,它们都会被替换成地址。编译和链接过程的一项重要任务就是找到这些名称所对应的地址

 

注意:虽然变量名、函数名、字符串名和数组名在本质上是一样的,它们都是地址的助记符,但在编写代码的过程中我们认为(1变量名表示的是数据本身,而2函数名字符串名和数组名表示的是代码块或数据块的首地址

指针变量的概念

数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为指针变量

例如:假设有一个 char 类型的变量 c,它存储了字符 'K'ASCII码为十进制数 75),并占用了地址为 0X11A 的内存(地址通常用十六进制表示)。另外有一个指针变量 p,它的值为 0X11A,正好等于变量 c 的地址,这种情况我们就称 p 指向了 c,或者说 p 是指向变量 c 的指

                               

 

指针变量的定义

定义指针变量与定义普通变量非常类似,不过要在变量名前面加星号*,格式为:

数据类型 * 变量名;      

数据类型 * 变量名 = ;

*表示这是一个指针变量该变量存放的是一个数据的地址数据类型表示该指针变量所指向地址内存的数据类型

和普通变量一样,指针变量也可以被多次写入,如:

//定义普通变量

float a = 99.5, b = 10.6;

char c = '@', d = '#';

//定义指针变量

float *p1 = &a;

char *p2 = &c;

//修改指针变量的值

p1 = &b;

p2 = &d;

*是一个特殊符号,表明一个变量是指针变量,定义 p1p2 时必须带*。而给 p1p2 赋值时,因为已经知道了它是一个指针变量,就没必要多此一举再带上*,后边可以像使用普通变量一样来使用指针变量。也就是说,定义指针变量时必须带*,给指针变量赋值时不带*

假设变量 abcd 的地址分别为 0X10000X10040X20000X2004,下面的示意图很好地反映了 p1p2 指向的变化:

需要强调的是p1p2 的类型分别是float*char*而不是floatchar它们是完全不同的数据类型要引起注意。

指针变量存储了数据的地址,通过指针变量能够获得该地址上的数据,格式为:

*pointer;        //这里的*称为指针运算符,用来取得某个地址上的数据

 

int x = 10;

int y = 20;

int *px = &x;

int *py = &y;

y = *px + 5;   //表示把x的内容加5并赋给y*px+5相当于(*px)+5

y = ++*px;    //px的内容加上1之后赋给y++*px相当于++(*px)

y = *px++;    //相当于y=*(px++)

py = px;        //把一个指针的值赋给另一个指针

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值