数据(内存)——指针

一、概念

著名的void* malloc(size_t size);函数,该函数的返回值是一个void*类型的对象,void*是一个无类型指针,怎么理解void*呢(指针的概念)?

它首先是一个指针,该指针指向了malloc申请的内存空间,其次void表示被指向的内存空间的数据类型;

上面这句话就是指针的概念。

指针是一个复合数据类型,我们使用sizeof()运算符操作一个指针,得到的是它的哪个数据类型的大小?——指针本身的大小而不是所指向的内存空间的大小即size,指针本身的大小永远都是8B,但是一个8B大小的指针却可以存储任意大小的内存空间的第一个字节的地址。

上面这段话是对指针概念的理解。

二、本质

指针的本质涉及计算机的工作原理。从内存的角度说,计算机正是通过指针或者说地址这样一个64位的数来对内存单元进行编号和寻址的;从CPU的角度说,我们经常说计算机是多少位的或者说字长(CPU一次可以处理的数据长度)一般也是和指针长度一致,这是由于内存寻址的需求,指针是最频繁的需要处理的数据。所以,指针机制本身就是计算机的工作原理的一部分,并不是说Java等高级语言没有指针了,而是它们封装了指针使得程序员不再需要直接操作内存。

三、指针的声明、定义、初始化

1 声明、定义

int* pi;   //  这行代码即定义了一个名叫pi的整型指针

2 初始化

①未初始化的指针变量的默认值

pi并未初始化,其默认值为null,这个全0的地址位于保留区域,未初始化的指针是不能使用的,因为保留区域不能被程序员使用。

②初始化:

int i = 1;
int* pi = &i;

四、*和&

在指针的定义与初始化中我们使用了两个运算符:*和&。这两个运算符中,*除了在定义时用来表示指针的指针类型外,还有另一个功能——取指针所指向的数据:

int n = *pi;   // n的值是1

 &的功能在于取数据的地址。

深入理解:

假设有一个 int 类型的变量 a,pa 是指向它的指针,那么*&a&*pa分别是什么意思呢?

首先先说清楚*和&不区分优先级。

*&a == *(&a) == *pa == a

&*pa == &(*pa) == &a == pa

五、指针的运算

通过二、指针的本质我们知道指针的本质就是一个用作给内存单元编号的64位数啊,既然它是个数,那么势必可以进行运算,运算之后的指针值变化为了其它指针值即该指针所指向的内存变了,因而我们也不能瞎算,指针一般可以用来加减比较

对指针进行加减操作也叫移动指针。典型的应用便是在数组中,由于数组名本身就是一个指向数组首元素的指针,数组名 + 1即是第二个元素了,数组名+3即是第四个元素了;

两个指针之间进行比较来判断两指针所指向的内存是否是同一地址单元。

六、多级指针

 1 定义

int i = 1;
int* pi = &i;
int** ppi = π   // ppi即是一个二级指针

 定义的时候有几个*意味着几级指针。

 2 概念

通过上面的例子,ppi是一个指向了一个一级指针的指针,这样的指针就可以定义为二级指针,以此类推,如果我们要定义一个指向了指向ppi的指针,则该指针应定义为三级指针,因而多级指针的本质其实就是指向指针的指针

3 应用

在实际应用中实际上也用不到很高级的指针,一般也就用个二级,经典应用是,我们可以定义一个二级指针指向一个二维数组。

四、指针和其他数据类型的结合

1 数组:详见《数据(内存)——数组》

2 字符串:详见《数据(内存)——字符串》

3 函数:详见《数据(内存)——函数》

4 结构体:详见《数据(内存)——结构体》

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值