初识指针1

1什么是指针

1.1内存和地址 

在此之前,我们先来介绍一下内存和地址的关系,我们将内存分成一块一块,最小的内存单位是字节,而一个字节是8个比特位,一个比特位可以储存一个二进制位。而每一个字节都有一个编号。我们可以通过地址去找到每一个字节所在的位置。

1.2内存的编址

计算机中的编址,是通过硬件设计完成的。

首先必须理解,计算机内有很多的硬件单元,而硬件单元是要相互协同工作的,所谓的协同,至少相互之间要能够进行数据传递。

但硬件与硬件之间是互相独立的,那么如何通信呢?答案很简单,用线连起来。

不过,我们今天关心一组线,叫做地址总线,我们可以简单理解32位机器有32地址总线,每根线只有2态表示0,1,那么32根地址线就能表示2的32次方种含义,而每一种含义都代表一种地址线。

地址信息被下达给内存,在内存上就可以找到该地址对应的数据,将数据通过传入CPU内寄存器。

2指针变量和地址

2.1取地址操作符(&)

理解了内存和地址的关系后,我们来回到c语言中,在C语言中创建变量就是向内存中申请变量比如,int a=1;就是申请一块内存为4个字节的位置来储存1,而变量的名字是a。我们想知道变量a

所在的位置,就可以用&操作符得到a的地址,代码如下:

int main() {
	int a = 0;
	int* p = &a;
}

 变量a的地址,我们又储存在了变量p中,而储存地址的变量就叫指针。int*表示变量p的类型,*号前面的int表示p中所存地址所在的变量的数据类型是int型。

而int型数据是4个字节,我们&a取得的是a所占4个字节中地址较小的字节的地址。

2.2解引用操作符 

上面我们将变量a的地址放在p中,我们如何使用它呢,这时候就要用到解引用操作符了。*p的意思就是通过p中存放的地址,找到指向的空间,*p其实就是a变量,所以*p=0;其实就是把a改成了0,代码如下

 

可以看到a的值确实变成了0。

2.3指针变量的大小 

前面的内容可以了解到,32位机器假设有32跟地址线每根地址线出来的电信号转化成数字信号后是1或0,那我们把32位地址线产生的2进制序列当作一个地址,那么一个地址就是32个bit位,需要4个字节才能储存。

同理,如果是64位机器,就有64根地址线,会产生64位的二进制序列,因此需要8个字节来储存地址。我们用sizeof操作符来验证,代码如下:

因此,我们可以看到指针的大小跟类型无关,只跟平台有关。 

3指针变量类型的意义 

3.1指针的解引用 

 前面,我们已经了解*的作用,就是通过地址找到该地址中的储存的变量,对其使用或修改。那么解引用操作符一次能访问几个字节呢,这就跟指针变量的类型有关了。比如:char*类型的指针一次可以访问1个字节,而int*一次可以访问4个字节,同里short*就是2个字节。

3.2指针加减整数 

char*类型的指针加1表示跳过一个字节,同理int*类型的指针变量+1表示跳过4个字节

总结,指针的类型决定了指针在加减整数后向前或向后有多大距离 。

3.3void*指针

在指针类型中有一种特殊的指针是void*型指针,也可以理解为无具体类型的指针,这种指针可以用来接收任意类型地址。但是也有局限性,void*型指针不能进行指针的加减整数操作和解引用的·运算。 

4const修饰指针变量 

很好理解,const修饰指针变量可以放在*号的前面,也可以放在*号的后面,意义是不一样的。 

4.1放在*号前面 

放在*号左边,当我们使用后指针变量存放一个变量的地址后,就无法使用解引用操作符去访问该地址了,有两种写法,第一种:

int a=0;
int const*p=&a;

 第二种:

int a=0;
const int *p=&a;

 此时,虽然无法使用解引用操作符,但是可以更改变量p中储存的地址,代码如下:

int a=0;
int b=0;
int const*p=&a;
p=&b;

4.2放在*号后面

放在*号后面则跟刚才完全相反,无法更该指针变量p所指向的指针,但可以使用解引用操作符来访问p所指向的变量 ,代码如下:

int a=0;
int *const p=&a;
*p=1;

4.3同时修饰*的前面和后面 

当然,也可以同时修饰前面和后面,则即无法更改p所指向的地址,也无法访问p中所存地址的变量,代码如下:

int a=0;
int const*const p=&a;

好了,这篇文章就先到这里,后面再介绍更多的指针变量类型和指针变量的使用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值