指针和指针变量

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

  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. IOS应用FFMPEG库

    1.引用资源 build-ffmpeg  ffmpeg库生成 -sh开源地址: https://gist.github.com/m1entus/6983547 iFrameExtractor ffmp ...

  2. PHP中使用 $_GET 与$_POST 实现简单的前后台数据传输交互功能

    在之前的学习过程中我们接触过前后台数据请求交互的方法有表单提交.AJAX请求以及Angularjs中的$http,今天我们尝试在PHP中使用 $_GET 与$_POST 实现简单的前后台数据传输交互功 ...

  3. 解决网络通信中外网和内网之间的通信问题(NAT转换)

    本文原址 http://www.cnblogs.com/lidabo/p/3828846.html 在网络编码中会发现程序在局域网中是可以适用的,但是在外网与内网之间和内网与内网之间就不可行.问题就在 ...

  4. VNC 远程连接vmware下centOS7

    VNC ( Virtual Network Computing)是一个linux下提供远程桌面支持的服务,类似于windows下的远程桌面服务,本来我是准备用xmanager来远程连我虚拟机中的cen ...

  5. JS框架设计读书笔记之-异步

    setTimeout/setInterval 1. 如果回调执行时间大于间隔时间,真正的间隔时间会大一些. 2. 存在一个最小的时间间隔,即使seTimeout(fn,0),在IE6-IE8中大概为1 ...

  6. 总结:PyQt5自定义信号源

    定义一个信号源有4个方面要注意: 1.定义信号源 A = pyqtSignal([str], [int,str]) 这里特别使用信号源重载的情况加以说明.如上就是信号源A的重载,一个可以发送str参数 ...

  7. Cactus

    Cactus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  8. 暑假练习赛 007 E - Pairs

    E - Pairs Description standard input/outputStatements In the secret book of ACM, it’s said: “Glory f ...

  9. inotify+rsync实现实时同步

    第1章 数据实时同步介绍 1.1 什么是实时同步:如何实现实时同步 A. 要利用监控服务(inotify),监控同步数据服务器目录中信息的变化 B. 发现目录中数据产生变化,就利用rsync服务推送到 ...

  10. npminstall无法安装node-sass

    cannot download "https://hithub.com/sass/node-sass/releases/download/v3.13.0/win32-x64-46_bindi ...