C——详解指针

一、指针的概念

1.指针是什么

程序运行时会加载到内存,也会使用内存空间。给每个内存单元进行编号,这样只要知道内存编号,就能找到内存单元。指针是内存中一个最小单元的编号,也就是地址。

我们可以通过取地址操作符&取出变量的地址,把地址存放到一个变量中,这个变量就是指针变量。

需要注意的是:

整型变量占4个字节,&a取出的是第一个字节的地址

一个最小的内存单元的大小是一个字节

2.指针类型

指针的定义方式:type+*

只要把指针声明语句中指针名字去掉,剩下的部分就是指针类型

如char* 类型的指针是为了存放char类型变量的地址,一次访问一个字节。

   int*    类型的指针是为了存放 int 类型变量的地址,一次放访问4字节。

3.指针所指向的类型

把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。

int* p     指针所指向的类型是int 

char* p  指针所指向的类型是char 

4.指针的值(指针所指向内存区或地址)

在32位的机器上,地址是32个0或者1组成二进制序列,那地址就得用4个字节的空间来存储,所以

一个指针变量的大小就应该是4个字节。

在64位机器上,如果有64个地址线,那一个指针变量的大小是8个字节,才能存放一个地址。

5.指针类型转换

6.二级指针

ppa就是一个二级指针

二、指针运算

1.指针+-整数

指针类型决定了指针向前或向后走一步有多大距离。

char*类型的指针+1跳过一个字节,int*类型的指针+1跳过4个字节

2.指针-指针

前提:两个指针要指向同一块空间;

指针-指针的绝对值,得到的是两个指针之间的元素个数。

举例:库函数strlen的模拟实现

3.运算符&和*

这里&是取地址运算符,*是间接运算符。

&a 的运算结果是一个指针,指针所指向的类型是a 的类型,指针所指向的地址是a 的地址。

*p 的结果是p 所指向的东西,它的类型是p 指向的类型,它所占用的地址是p所指向的地址。

三、数组和指针

1.指针数组

指针数组是存放指针的数组

2.数组指针

数组指针是指向数组的指针

3.&数组名VS数组名

可见数组名和数组首元素的地址是一样的。

结论:数组名表示的是数组首元素的地址

&arr和arr虽然值一样,但是意义不同,数组名表示的是数组首元素的地址,而&数组名表示的是数组地址,所以&arr+1跳过整个数组的大小。

四、函数和指针

1.函数指针

取出的是地址

阅读两个有趣的代码

2.函数指针数组

要把函数的地址存到一个数组中,那这个数组就叫函数指针数组

举例:计算器

3.指向函数指针数组的指针

4.回调函数

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数 的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

五、野指针

野指针就是指针指向的位置不可知(随机的、不正确的、没有明确限制的)

野指针的成因

1、指针未初始化

2、指针越界访问

3、指针指向的空间释放

如何规避野指针

1. 指针初始化

2. 小心指针越界

3. 指针指向空间释放,及时置NULL

4. 避免返回局部变量的地址

5. 指针使用之前检查有效性

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值