指针和指针变量

  指针就是地址,地址是一种数据类型。指针变量也是变量,但只能存放地址类型的数据,可以称为“地址型”变量。

  1)内存单元和地址

  一个程序运行时,程序本身和程序中用到的数据都要保存在计算机的内部存储器中。内部存储器是由多个内存单元(字节)组成的,每个单元都有自己独有的,相互不同的地址,称内存单元地址。

  2)变量与地址。

  char ch='A';   short s =5;  float f;    他们分别是1个字节,2个字节,4个字节。(也就是内存单元)

  如果出现这样的赋值语句“f=s+ch;”,操作过程是:

  1.在变量地址对照表中找到变量a,取出s的地址(2010),考虑到其数据类型是短整型,所以从该地址开始的2个字节中取出1个整数(5);

  2。根据同样的方法去除变量ch中的字符‘A’(想当于整数65),相加获得表达式的值为70.

  3.然后再变量与地址对照表中找到变量f的地址,考虑到其数据是单精度型,所以将结果70转换成单精度实行的70.0,再存入变量f对应的4个字节中。

  以上操作,通过变量名查取变量的地址,再从变量对应地址的字节中取得值或将某值存入变量对应地址的字节中称为直接存取方式,由于地址能起到寻找“操作队形”的作用,就像一个指向“操作对象”的指针,所以常把地址称为“指针”。

  3)数组与地址

  除了变量以外,程序中还可以用数组来存放数据。每个数组元素也要占用连续的内存单元。一个数组占用的总字节数等于数组长度乘以每个数组元素占用的字节数。

  在源程序进行编译时,每遇到一个数组,按其数据类型和长度分配内存单元,同时在“数组与地址对照表”中记录数组名、数据类型、数组长度、数组首地址。

  例如这个语句  short a[3]={1,2,3};

  

  在数组地址对照表中找到数组a,取出首地址,按公式计算出数组元素a[0]的地址:3210+0*2=3210,从该地址开始的2个字节(3210、3211)中取出整数1;按相同的方法取出数组元素a[2](地址是3210+2*2=3214)中的整数3,进行相加,得到结果4.然后通过公式计算出a[1]的地址:3210+1*2=3212,再将计算结果4存入3212开始的2个字节(3212、3213)中。上述操作中,通过查表获得数组首地址,通过计算元素地址的方式先获得元素的地址,然后通过这个地址取得元素的值,或将值存入元素的方式也是直接存取方式。

  4)指针变量

  先把要存取的变量的地址存入一个“特殊变量”,然后通过这个其值为地址的“特殊变量”来存取变量的值,这种存取方式由于通过一种存放地址的“特殊变量”来实现的,所以称为间接存取方式。

  这种存放地址值的“特殊变量”就是指针变量。

  使用指针变量:

  通过间接存取方式完成赋值语句“a[1]=i*j;”的操作。事先将变量i、j和数组元素a[1]的地址分别存入指针变量p_i、p_j、p。以后的操作过程如下:先从指针变量p_i中取出i的地址,再从内存该地址中取出变量i的值;按同样方法,通过指针变量p_j取出变量j的值进行相乘;再从指针变量p中取出数组元素a[1]的地址,将运算结果存入内存的该地址中。

指针变量的使用方式

  1)给指针变量赋值

    格式为:指针变量=地址型表达式。

    取地址的运算符是“&”,运算对象是变量或数组元素名,运算结果是对应变量或数组元素的地址。

    例如:变量 i 的地址应写成地址表达式“&i”,数组元素a[1]的地址应写成地址表达式“&a[1]”。

    注意:虽然地址是一个整数,但是,在C语言中不允许把整数看成“地址常量”。所以这的“地址型表达式”不能是整数。

    例如:int i , *p_i

    p_i = &i //使指针变量p_i指向变量i,这的&i 就是地址型表达式。

    p_i = 100;  //企图使指针变量p_i指向地址为100的内存单元,这是错误的。

  2)直接使用指针变量名。

    需要用到地址时,可以直接引用指针变量名。

    例如:int i,j, *p=&i,*q;

    q=p;  //将指针变量p的值(i的地址)赋予指针变量q。

    scanf("%d,%d",q,&j);  //使用指针变量q接受输入数据存入q指向的变量i。

  3)通过指针变量来引用它所指向的变量。

    使用格式为:*指针变量名。

    例如:int i =1,j=2,k,*p=&i;

    k=*p+j; //由于p指向i,所以*p就代表i,结果k等于3.

  注意:取地址运算符的运算对象必须是已定义过的变量或数组元素,但不可以是数组名。运算结果是运算对象的地址。例如,定义了变量a,数组b[10],则&a,&b[0],&b[9]均合法,分别代表变量a地址,数组元素b[0]的地址,数组元素b[9]的地址;而&b则是错误的。

  4)数组的指针变量处理数组元素

  当指针变量指向一维数组后,对下标i的数组元素引用一共有下列四种方法:

  *(指针变量+i)  *(数组名+i)   指针变量[i]   数组名[i]

  前两种引用一维数组元素的方法使用了“指针运算符”,称为指针法;后两种使用一维数组元素的方法是“下标运算符([])”,称为下标法;

  指针的运算规则如下;

  指针变量+整数  “指针变量中的地址+整数*指针变量类型占用字节数” 对应的地址。

  指针变量-整数  “指针变量中的地址-证书*指针变量类型占用字节数”对应的地址。

  ++指针变量  “指针变量中的地址+指针变量类型占用字节数” 对应的地址,此后,指针变量将指向后一个数组元素。

  --指针变量  “指针变量中的地址-指针变量类型占用字节数” 对应的地址,此后,指针变量将指向前一个数组元素。

  指针变量++  “指针变量中的地址”对应的地址(因为是后缀增1运算符)此后,指针变量指向后一个数组元素

  指针变量--  “指针变量中的地址”对应的地址(因为后缀减1运算符)此后,指针变量将指向前一个数组元素

  注意:指针变量pa已指向数组a,只想“pa=a” 是正确的,因为对变量可以赋值;而执行“a=pa”是错误的,因为不能对常量进行赋值。

指针数组

  指针数组的定义和一般数组的定义方法基本相同。需要注意指针数组是指针类型,定义时必须在数组名前面加“*”;

  格式为:数据类型  *指针数组名[长度]

  说明:1)指针数组名是标识符,前面必须有“*”号

  2)定义指针数组时的“数据类型”可以选取任何基本数据类型,也可以选取以后介绍的其它数据类型。这个数据类型不是指针型数组元素中存放的数据类型,而是它将要指向的数据的数据类型。

  3)在一个定义语句中,可以同时定义普通变量、数组、指针变量、指针数组。

  例如:

  int * p[3]; //定义了一个名为p、用来指向整形数据的指针型数组,有3个元素:p[0]、p[1]、 p[2]

  float x=1.0

  *p_float[10];//定义一个名为p_float、用来指向单精度实型数组的指针型数组,有10个元素;p_float[0]........p_float[10]

  指针数组名[下标]=地址表达式    对其赋值

  *指针数组名[下标]          引用所指向的变量或数组元素

  参加运算:

  指针数组名[下标]+整数

  指针数组名[下标]-整数

  ++指针数组名[下标]

  --指针数组名[下标]

  指针数组名[下标]++

  指针数组名[下标]--

  指针数组名[下标1] 关系运算符指针数组名[下标2]

4)C语言指针(C自考学习)的更多相关文章

  1. 2-Linux C语言指针与内存-学习笔记

    Linux C语言指针与内存 前面我们对于: c语言的基本用法 makeFile文件的使用 main函数的详解 标准输入输出流以及错误流管道 工具与原理 指针与内存都是c语言中的要点与难点 指针 数组 ...

  2. [转]C语言指针学习经验总结浅谈

    指针是C语言的难点和重点,但指针也是C语言的灵魂 . 这篇C语言指针学习经验总结主要是我入职以来学习C指针过程中的点滴记录.文档里面就不重复书上说得很清楚的概念性东西,只把一些说得不清楚或理解起来比较 ...

  3. C语言指针学习

    C语言学过好久了,对于其中的指针却没有非常明确的认识,趁着有机会来好好学习一下,总结一下学过的知识,知识来自C语言指针详解一文 一:指针的概念 指针是一个特殊的变量,里面存储的数值是内存里的一个地址. ...

  4. GO语言学习(十五)Go 语言指针

    Go 语言指针 Go 语言中指针是很容易学习的,Go 语言中使用指针可以更简单的执行一些任务. 接下来让我们来一步步学习 Go 语言指针. 我们都知道,变量是一种使用方便的占位符,用于引用计算机内存地 ...

  5. C语言指针学习总结

    上学的时候学习C语言,最烦的就是里面指针,可是指针也恰恰是C语言的灵魂. 最近在重温数据结构的内容,因为大多数据结构的教材都是用C语言描述的,而数据结构中也大量的用到了指针的内容,所以我就在这篇笔记中 ...

  6. (转载)c语言指针学习

    前言 近期俄罗斯的陨石.四月的血月.五月北京的飞雪以及天朝各种血腥和混乱,给人一种不详的预感.佛祖说的末法时期,五浊恶世 ,十恶之世,人再无心法约束,道德沦丧,和现在正好吻合.尤其是在天朝,空气,水, ...

  7. go学习笔记-语言指针

    语言指针 定义及使用 变量是一种使用方便的占位符,用于引用计算机内存地址.取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址. 一个指针变量指向了一个值的内存地址.类似于变量和常量, ...

  8. c语言指针学习【转】

    前言 近期俄罗斯的陨石.四月的血月.五月北京的飞雪以及天朝各种血腥和混乱,给人一种不详的预感.佛祖说的末法时期,五浊恶世 ,十恶之世,人再无心法约束,道德沦丧,和现在正好吻合.尤其是在天朝,空气,水, ...

  9. c语言指针详解(转载)

    转自(http://blog.csdn.net/ad_ad_ad/article/details/1522145) 指针是C语言中广泛使用的一种数据类型. 运用指针编程是C语言最主要的风格之一.利用指 ...

  10. 关于C语言指针的问题

    在学习关于C语言指针的时候,发现这样一个问题,代码如下: #include<stdio.h> #include<stdlib.h> #include<string.h&g ...

随机推荐

  1. 【Spring】浅谈spring推荐构造器注入

    一.前言 ​ Spring框架对Java开发的重要性不言而喻,其核心特性就是IOC(Inversion of Control, 控制反转)和AOP,平时使用最多的就是其中的IOC,我们通过将组件交由S ...

  2. win10 uwp 存放网络图片到本地

    有时候我们的网络很垃圾,我的的UWP要在第一次打开网络图片,就把图片存放到本地,下次可以从本地打开. 有时候用户使用的是流量网络,不能每次都联网下载. 我们不得在应用存放用户打开的图片. 这就是先把图 ...

  3. 张高兴的 Windows 10 IoT 开发笔记:HC-SR04 超声波测距模块

    HC-SR04 采用 IO 触发测距.下面介绍一下其在 Windows 10 IoT Core 环境下的用法. 项目运行在 Raspberry Pi 2/3 上,使用 C# 进行编码. 1. 准备 H ...

  4. JavaScript函数之作用域 / 作用链域 / 预解析

    关于作用域和作用链域的问题,很多文章讲的都很详细,本文属于摘录自己觉得对自己有价值的部分,留由后用,仅供参考,需要查看详细信息请点击我给出的原文链接查看原文件 做一个有爱的搬运工~~ -------- ...

  5. java遍历hashMap、hashSet、Hashtable

    一.遍历HashMap Map<Integer, String> map = new HashMap<Integer, String>(); 方法一:效率高 for(Entry ...

  6. Windows下安装RabbitMQ

    今天正好给自己机器安装rabbitmq,总结下安装经验. 现在国内访问erlang,和 RabbitMQ 官网好像都很难连上.我已下载好了资源,需要的朋友可以下载. 链接: https://pan.b ...

  7. MySQL数据库主从复制实践

        MySQL 主从(MySQL Replication),主要用于 MySQL 的实时备份.高可用HA.读写分离.在配置主从复制之前需要先准备 2 台 MySQL 服务器. 一.MySQL主从原 ...

  8. 用linux文件处理三剑客将微信群成员导出的方法

    工具: Mac/Linux 系统 Chrome Linux命令:vi.cat. wc. grep. awk. sed.sort. uniq 步骤: 1.微信网页版登陆: https://wx.qq.c ...

  9. 解决Python2.7的UnicodeEncodeError:'ascii' codec can't encode characters in position 0-78: ordinal not in range(128)异常错误

    解决Python2.7的UnicodeEncodeError: 'ascii' codec can't encode异常错误 大家都知道,在使用python进行网络爬虫时,最头疼的就是转码问题,下面是 ...

  10. Pendant

    Pendant Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...