指针--基础篇

简介: 指针--基础篇

数据在内存中的存储

如果在程序中定义了一个变量,则在对程序进行编译时,系统会为这个变量分配内存单元。内存的基本单元是字节,一个字节有8位,每一个字节都有一个编号,这个编号就是“地址”。

变量的直接访问与间接访问

直接访问:

程序中通过变量名对变量的访问,实际上是通过变量地址、按照变量的数据类型对相应的内存单元进行操作的。通过变量地址可以找到该变量所占的内存单元。因此可以说,变量地址“指向”变量的存储单元

例如:

int a;
float x;
a=872;
x=a+28;

程序中定义了整型变量a和浮点变量x,分别占据不同的内存单元。

假设系统分配4000H和4001H两个字节给变量a,系统给x分配4002H、4003H、4004H、4005H四个字节。则变量a的地址为4000H,变量x的地址为4002H变量地址仅仅是变量在内存中所分配存储空间的低字节的地址。)除此之外,还必须根据变量的数据类型来确定读写操作的方式。故4000H可以理解为是int型数据的地址,4002H可以理解为是float型数据的地址。

在执行“a=872”时,将872按照整型数据的存储方式写入地址4000H所指向的内存单元,即以int型数据写入了4000H和4001H标识的两个字节的内存单元中。

在执行“x=a+28”时,由于运算符的优先性,先计算”a+28“,这时,从地址4000H按照int型数据读出地址4000H和4001H标识的内存单元中的内容872,然后将872+28的运算结果900按照浮点型数据的存储方式写入4002H、4003H、4004H、4005H标识的4个字节的内存单元中。

间接访问

即变量中存放的是另一个变量的地址。按照C语言的规定,可以在程序中定义整型变量、实型变量、字符型变量,也可以定义一种特殊的变量,它是存放地址的。

通过地址能够找到所需要的内存单元。地址“指向”该变量单元。

指针变量里存放的是地址,将这个地址形象地称为**”指针“**

区分:指针与指针变量:指针是指一个地址,而指针变量是一个存放地址的变量。

指针和指针变量

在程序中”*“表示指向,如果定义变量i为指针变量,那么”*i“就表示指针变量i里面所存放的地址所指向的存储单元里面的数据。

指针变量的定义

指针变量定义的一般格式:

基类型*指针变量名

int *i;
float *j;

说明:

  1. "*"指明是指针类型。
  2. 变量名是 i和 j,而不是i和j。
  3. 定义指针变量时必须指明基类型。即int型指针变量i 中只能存放int型变量的地址。float型指针变量j中只能存放float型变量的地址.
  4. int*i表示定义了一个指针变量i,且这个变量中只能存放int型变量的地址,但是并没有对此初始化。即此时的指针变量并未指向任何一个变量。
  5. “指针变量的地址"与"指针变量的内容”:指针变量也是变量,是变量就有地址,所以在运行时系统就会为它分配内存空间,所以这是"指针变量"的地址。而指针变量里又是存放变量的地址的,这个变量的地址称为"指针变量的内容"。

指针变量的初始化

int i;*j;
j=&i;
  1. 在编译时,系统会给变量a和变量j分配内存单元。假设给i分配4000H和4001H两个字节,给j分配4002H和4003H两个字节,则4000H是变量i的地址,4002H是变量j的地址。
  2. 将i的地址放到了变量j中,通过i的地址,j就能找到i中的数据。所以j”指向“了变量i。
  3. 因为j是指针型变量,只能存放地址,所以一定不能忘了取地址符”&“。
  4. “*j” 和"j":定义指针变量时 * 只是一个声明,说明这是一个指针变量。但此时并没有对j这个指针变量初始化。 当指定j指向变量i之后,*j和i就完全等同了,可以相互替换。

“内存单元的地址"与"内存单元的内容”

#include <stdio.h>
int main (void)
{
  int i,*j;  //先定义再初始化
  i=3;
  j=&i;
  printf("%d\n",*j);  //*j表示的是指针变量j中所存放的地址即i的地址所面向的存储单元里的数据即3.
  printf("%d\n",j);  //j中存放的是i的地址
  return 0;
}
3
1703728
#include <stdio.h>
int main (void)
{
  int i=3;
  int *j=&i;  //定义指针变量j并完成初始化
  printf("%d\n",*j);
  printf("%d\n",j);
  return 0;
}
3
1703728

指针变量与指针变量之间的相互赋值

要求:

  1. 两个指针变量的基类型一定要相同
  2. 赋值运算符"="右边的指针指针变量一定是初始化过的。
#include <stdio.h>
int main (void)
{
  int a=1;
  int *i,*k;
  i=&a;   \\给指针变量i初始化
  k=i;    \\将指针变量i的值赋值给指针变量k
  printf("%d\n",i);
  printf("%d\n",k);
  return 0;
}
1703728
1703728


相关文章
|
JavaScript 前端开发 API
Fish开发与使用
审批系统使用es5,现在fish组件里面,用了大量的bind(this)方法,bind解决了this作用域问题,es6有箭头函数解决这个问题 es5没有箭头函数。 正常的js文件中必须包含的几个内容: 1.在文件的开始,要引入当前js文件需要用到的html文件,调接口使用到的action文件,或者特定样式的css文件, 引入HTML文件,格式是:”hbs!”+对应文件的整个路径, 引入js文件,格式是:对应文件的整个路径,文件名不需要加后缀名js
Fish开发与使用
|
消息中间件 SQL JSON
自建MQTT迁移阿里云物联网平台指南
2020年是5G大规模商用的元年,使用阿里云物联网平台在产业爆发前打造一套安全可靠的业务架构,更能解放人力专注业务开发!
16426 0
|
算法 程序员 芯片
程序员必知:UCF约束介绍
程序员必知:UCF约束介绍
9675 4
|
安全 算法 JavaScript
MRP算法概要
一. 时间范围的确定: T1 T2 T3 T4   T2: 系统日期T3: 计划展望期的开始日期(通常情况下T2与T3为同一天)。T4: 计划展望期的结束日期。
2368 0
|
关系型数据库 MySQL Windows
|
存储 Serverless 索引
408数据结构学习笔记——B树、B+树、散列表
408数据结构学习笔记——B树、B+树、散列表
486 1
408数据结构学习笔记——B树、B+树、散列表
|
SQL 分布式计算 Oracle
一文解析大数据的JOIN
本文大部分理论和问题都从maxcomputer中得出,不同的计算引擎底层结构不同最后结果可能稍微不同,这一点需要注意,本文应该可以让你不再苦恼各种join,或者更加苦恼join。
1327 0
一文解析大数据的JOIN
|
存储 SQL 安全
加盐密码哈希:如何正确使用
加盐密码哈希:如何正确使用
729 0
加盐密码哈希:如何正确使用
|
网络协议 Linux API
使用cobbler 安装工具批量安装服务器
Cobbler是一个Linux服务器安装的服务,可以通过网络启动(PXE)的方式来快速安装、重装物理服务器和虚拟机一,同时还可以管理DHCP,DNS等。
293 0
使用cobbler 安装工具批量安装服务器