指针初步认识

1.认识内存和地址

1.1内存

大量的数据在电脑的内存中存储着,内存就相当于一大块空间,而这一大块空间中会有着很多的小空间

如果CPU(中央处理器)需要一些数据进行计算,此时就要从内存中取出这些数,但是如何准确且快速的找到数据????

1.2地址

为了能准确且快速的找到内存中的位置,我们给每一个内存单元都进行了编号,而这个编号就是所谓的地址,也就是我们平时所说的指针,通过这个地址我们就能访问指定的内存单元

1.2地址的产生

⾸先,必须理解,计算机内是有很多的硬件单 元,⽽硬件单元是要互相协同⼯作的。所谓的协 同,⾄少相互之间要能够进⾏数据传递。 但是硬件与硬件之间是互相独⽴的,那么如何通 信呢?答案很简单,⽤"线"连起来。 ⽽CPU和内存之间也是有⼤量的数据交互的,所 以,两者必须也⽤线连起来。 不过,我们今天关⼼⼀组线,叫做地址总线。 我们可以简单理解,32位机器有32根地址总线, 每根线只有两态,表⽰0,1【电脉冲有⽆】,那么 ⼀根线,就能表⽰2种含义,2根线就能表⽰4种含 义,依次类推。32根地址线,就能表⽰2^32种含 义,每⼀种含义都代表⼀个地址。 地址信息被下达给内存,在内存上,就可以找到 该地址对应的数据,将数据在通过数据总线传⼊ CPU内寄存器。 

这些属于计算机组成原理的内容,在此只需要理解地址是如何产生的。

2.指针变量和地址

2.1 & 取地址操作符

我们理解了内存和地址之间的关系,现在我们回到C语言中,在C语言中创建变量其实就是向内存申请空间

 

上述代码中我们创建了一个变量a,在内存监视窗口中我们能看到为了存放a这个变量向内存申请了四个字节存放a

此时我们能看到存放a的地址,a是int 占用四个字节,此时就有四个地址

0x000000CC77FDF5E4  0a  .
0x000000CC77FDF5E5  00  .
0x000000CC77FDF5E6  00  .
0x000000CC77FDF5E7  00  .

观察内存地址可以得出,存放 a的四个字节的空间是连续的,这样我们只要知道第一个地址,就能顺着将后面的地址找出        

如何能找到a的地址呢?

此时就需要&(取地址)操作符,通过这个操作符就能得到a在内存中的地址,例:

我们通过&操作就得到了a的首地址,顺着就能找到全部的地址

2.2   *  解引用操作符

2.2.1指针变量

在我们取得a地址之后我们如何存放这个地址?

指针变量就是专门用来存放地址的一种变量

#include<stdio.h>
int main()
{
   int a=10;
   char b='a';
//若是想要存储a和b的地址,我们就需要用到指针变量
   int  *p1=&a;
   char *p2=&b;
   return 0;
}

 通过此段代码我们能发现,不同的变量类型需要相应的指针变量来存放,例如此段代码中:

   int    *              p1        =  &a  ;

变量类型         变量名

char    *              p2        =  &b ;

 变量类型         变量名

我们可以大胆猜测一下此代码的运行结果 

#include<stdio.h>
int main()
{
  int a=10;
  int *p=&a;
  printf("%d",a);
  printf("%d",*p);
  return 0;
}

 答案是输出了两个10

2.2.2  *  解引用操作

我们通过对以上代码和运行结果的分析我们能得出一个结果

在打印  a  和   *p  时a等价于*p

p存放了a的地址,通过解引用操作我们能够通过指针间接访问a,也能通过指针变量对变量进行修改,例:

#include<stdio.h>
int main()
{
  int a=10;
  int*p=&a;
  *p=20;
  printf("%d",a);
  printf("%d",*p);
  return 0;
}

读者可以将代码复制到本地编译器进行结果的验证,此时会输出两个20

3.指针的大小

我们在前面了解到,32位的机器会产生32个电信号,就是产生32个bit,地址的长度就是32个bit,也就是4个字节

同理,64位机器产生64个电信号,64个bit,也就是8个字节。

#include <stdio.h>
//指针变量的⼤⼩取决于地址的⼤⼩
//32位平台下地址是32个bit位(即4个字节)
//64位平台下地址是64个bit位(即8个字节)
int main()
{
 printf("%zd\n", sizeof(char *));
 printf("%zd\n", sizeof(short *));
 printf("%zd\n", sizeof(int *));
 printf("%zd\n", sizeof(double *));
 return 0;
}

                   32位运行结果                                                    64位运行结果

4.指针的类型

我们发现,指向整形的指针和指向字符类型的指针的类型不同,但是类型的不同到底有什么区别呢?实际上类型的不同决定了解引用操作时指针能够访问的权限,例如:char*类型在进行解引用操作的时候我们只能访问一个字节,int*能够访问四个字节。

在很多情况下我们可以巧妙的利用访问权限的大小去完成一些数据的修改和数据的读取 

这就是对指针的初步认识,随着学习会有更加详细且深入的指针内容

这就是对指针初步认识的全部内容了

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值