指针和指针变量

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

  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. 九大排序算法Demo

    1. 冒泡排序 冒泡排序(Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换, ...

  2. springcloud之服务注册与发现(Eureka)

    springcloud服务注册与发现 使用Eureka实现服务治理 作用:实现服务治理(服务注册与发现) 简介: Spring Cloud Eureka是Spring Cloud Netflix项目下 ...

  3. LDAP服务部署

    1.安装基本环境 # yum -y install openldap openldap-devel openldap-servers openldap-clients 2.配置LDAP服务端 (1)拷 ...

  4. 脱壳第一讲,手工脱壳ASPack2.12的壳.ESP定律

    脱壳第一讲,手工脱壳ASPack2.12的壳.ESP定律 一丶什么是ESP定律 首先我们要明白什么是壳.壳的作用就是加密PE的. 而ESP定律就是壳在加密之前,肯定会保存所有寄存器环境,而出来的时候, ...

  5. gnome 3 美化

    首先,去http://gnome-look.org/找到需要的主题,然后手动安装或者用下载到的主题包里的脚本安装 手动安装对应路径如下: 鼠标,图标主题解压放置:~/.icons或/usr/share ...

  6. 【ASP.NET MVC 学习笔记】- 04 依赖注入(DI)

    本文参考:http://www.cnblogs.com/willick/p/3223042.html 1.在一个类内部,不通过创建对象的实例而能够获得某个实现了公开接口的对象的引用.这种"需 ...

  7. [ACdream]小晴天老师系列——竖式乘

    题目链接:http://acdream.info/contest?cid=1269#problem-C Problem Description 小晴天是ACdream团队中最牛的老师之一,他最擅长数学 ...

  8. 我的第一个python web开发框架(13)——工具函数包说明(四)

    string_helper.py是字符串操作包,主要对字符串进行检查.过滤和截取等处理. #!/usr/bin/evn python # coding=utf-8 import re def chec ...

  9. Oracle 表空间扩充

    Oracle 表空间扩充 一.现场环境: (1)操作系统:AIX (2)数据库:Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - ...

  10. stl中auto_ptr,unique_ptr,shared_ptr,weak_ptr四种智能指针使用总结

    stl中auto_ptr,unique_ptr,shared_ptr,weak_ptr四种智能指针使用总结 1. auto_ptrauto_ptr主要是用来解决资源自动释放的问题,比如如下代码:voi ...