C语言复习—指针(1)

目录

1. 内存和地址

2. 指针变量和地址

3. 指针变量类型的意义

正文

1.内存和地址

1.1.内存

内存就像我们生活中的门牌号,通过门牌号,你的好朋友能够准确的找到你家的具体地址,这样就更加方便,而不是一间一间去确认是不是你家。我们计算机的中央处理器(cpu)在处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会放回到内存中。生活中我们的门牌号也可以叫地址,在C语言中我们把内存单元的编号也称为地址,并且给他取了个新名字--指针。

因此我们也可以理解为:内存单元的编号==地址==指针

2.指针变量和地址

2.1取地址操作符(&)

C语言当中,创建变量其实就是向内存申请空间,比如:

上述代码就是创建了个整形变量,向内存中申请了4个字节的空间,用于存放整数5,每个字节都有对应的地址,那我们要怎么获取a的地址呢?

这里就要用到一个操作符——>取地址操作符(&)

 2.2 指针变量和解引用操作符

2.2.1 指针变量

我们通过取地址操作符取出来的地址是一个数值,有时候这个数值也要存起来方便后期的使用,这样就产生了指针变量这个东西,代码演示如下:

指针变量本质也是一种变量,这种变量就是用来存放指针的

2.2.2 如何拆解指针类型

上述代码当中pa变量的类型是int*类型,那么我们要怎么理解指针的类型呢?

上述的int*当中,*是在说明pa是指针变量,前面的int则是说明pa指向的是整型类型的对象。

整型变量的指针是如此,那么对于char类型的变量,指针变量类型又要怎么写呢?请看以下代码

2.2.3 解引⽤操作符
我们将地址保存后,需要使用的时候要怎么用呢?
在C语言中,只要我们获取了一个地址,就可以通过地址找到地址所指向的对象,这里就要用到一个操作符——> 解引用操作符(*),废话不多说,直接看代码演示
上述的代码当中就使用了解引用操作符——*pa,意思就是通过pa中的地址,找到其所指向的空间也就是变量a, 所以*pa = 0,这个操作符是把a改成了0
2.3 指针变量的大小
这里直接通过代码来表述
3. 指针变量类型的意义
既然说指针变量的大小和和类型无关,只要是指针变量,在同一个平台下,大小都一样,那有这么多类型的指针意义在哪里呢?
既然存在,那他必然是有自己的意义的,不然拿来干嘛,看又不好看,我们继续往下学习
3.1 指针的解引用
对比一下上面两个代码,在编译器上进行调试我们会发现第一个代码会把n的4个字节全部改为0,而第二个代码只会将n的第一个字节改为0;
因此我们得出 结论
指针的类型决定了对指针解引用的时候有多大权限(一次能操作几个字节)
3.2指针+-代码
先来段代码助助兴
运行结果如下
可以看得出来,类型的指针变量+1跳过1个字节,int*类型的指针变量+1跳过4个字节,这就是指针变量的类型差异带来的变化
结论:指针的类型决定了指针向前或者向后⾛⼀步有多⼤(距离)
3.3void*指针
指针类型中有一种比较特殊的类型叫void*类型,可以理解为无具体类型的指针(泛型指针),这种类型的指针可以接受任意类型地址,但同时也有局限,void*类型的指针不能直接进行指针的+-整数和解引用运算,代码演示
上面的代码将一个int类型的变量的地址赋值给一个char*类型的指针变量,在调试时编译器给出了读取字符串字符时出错,而使用void*类型就不会有这样的问题
使用void*类型的指针接收地址
编译器会直接报错,这里就能体现出来void*类型的指针可以接收不同类型的地址,但是无法进行指针运算
那void*到底有什么用呢?
一搬void*类型的指针是在函数参数部分使用的,用来接收不同类型数据的地址,这样的设计可以实现泛型编程的效果。
时间关系(还要留时间刷题),今天就写这么多,我们周四再见,这周我会把C语言指针部分完整复习一遍,当然也会全都发出来
  • 33
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值