指针变量的定义和引用(精)

合集下载

C++程序设计 第八章 指针和引用

C++程序设计  第八章 指针和引用
C++

在程序运行时变量和函数都存放在内存中,通过变量名来访问数据、通过函数名来调用函数都是直接访问方式。还有另一种间接访问方式就是用指针。指针的本质是内存地址。指针往往用于说明函数的形参,使实参能通过指针传递,以提高函数调用的效率。利用指针能动态地使用内存,以提高内存使用效率。指针也能用来表示数据关联,以构成复杂的数据结构。指针是C程序中最常见的类型。引用是C++扩展的新概念,主要用于函数形参和返回类型。本章将详细介绍指针和引用的概念及应用。
首先,这6个变量的地址是按递减次序排列,这是因为局部变量都存储在堆栈中,堆栈是先入后出的。先入栈的数据存放在较大地址位置,后入栈的数据存放在较小地址位置。如果这些变量改为全局变量,它们的排列次序就会颠倒过来。
其次,尽管变量s只占2字节,变量c只占1字节,但却分别占用4字节空间。这是因为按字对齐(32位数据)能提高CPU访问内存的效率,而且一次压栈和出栈操作也是以32位数据为单位,代价是浪费一些内存。如果这些变量改为全局变量,它们将按实际大小存储。
怎样能知道一个变量在运行时刻的内存地址?把取地址运算符&放在变量前面就得到它的首地址。例如b是一个变量,那么&b就表示它的地址。下面例子能看到一组局部变量的首地址。
例8-1显示一组局部变量的首地址。
#include<iostream.h>
void main(){
bool b = true;
char c = 'c';
其中,<类型名>是这个指针变量所指向的对象的类型,简称指针类型,它可以是任何一种类型。*表示这个变量是一个指针变量。这个变量的类型就是“<类型名>*”。<变量名>是一个标识符。指针变量可以进行初始化,等号之后给出一个变量的地址,要求这个变量的类型与指针类型相符。

指针变量的定义与引用

指针变量的定义与引用

指针变量的初始化
在定义指针变量时同时给该变量一个初始值, 在定义指针变量时同时给该变量一个初始值,称为 指针变量初始化。 指针变量初始化。 例如: 例如: int a=20; int *pa; pa=&a;(&为取地址符) ( 为取地址符 为取地址符)
指针变量的几点说明
(1)指针变量名前的“*”表示该变量为指针变量,而指针 )指针变量名前的“ ”表示该变量为指针变量, 变量名不包含该“ ” 变量名不包含该“*”。 (2)一个指针变量只能指向同一类型的变量。 )一个指针变量只能指向同一类型的变量。 (3)指针变量中只能存放地址,而不能将数值型数据赋给 )指针变量中只能存放地址, 指针变量。 指针变量。 (4)只有当指针变量中具有确定地址后才能被引用。 )只有当指针变量中具有确定地址后才能被引用。
指针变量的引用
对指针变量的引用包含两个方面: 对指针变量的引用包含两个方面:一是对指针变量 本身的引用,如对指针变量进行各种运算; 本身的引用,如对指针变量进行各种运算;二是利用指 针变量来访问所指向的目标,对指针的间接引用。 针变量来访问所指向的目标,对指针的间接引用。 与指针相关的两个运算符: 与指针相关的两个运算符: (1)&:取地址运算符 ) 取地址运算符 (2)*:指针运算符,取其指向的内容 ) :指针运算符, 指针指向的对象可以表示成如下形式: *指针变量 指针指向的对象可以表示成如下形式: *指针变量 特别要注意的是,此处*是访问指针所指向变量的运算 特别要注意的是,此处 是访问指针所指向变量的运算 与指针定义时的*不同 在定义指针变量时, 不同。 符,与指针定义时的 不同。在定义指针变量时,* 号表 示其后是指针变量。在其它位置出现, 号是运算符。 示其后是指针变量。在其它位置出现,* 号是运算符。 如果与其联系的操作数是指针类型, 是间接访问 引用) 是间接访问(引用 如果与其联系的操作数是指针类型,*是间接访问 引用 运算符;如果与其联系的操作数是基本类型, 运算符;如果与其联系的操作数是基本类型, *是乘法运算符。在使用和阅读程序时要严格 是乘法运算符。 是乘法运算符 区分* 号的含义。 区分 号的含义。

指向指针的指针和引用指针变量

指向指针的指针和引用指针变量

指向指针的指针和引用指针变量-----------------------------------------------------------**p与*&p的差别声明:以下内容仅为学习的理解,仅供参考!**p等价于*(*p),这里,p就是指向指针的指针,在这里*就是取地址运算符;*p是指向p,p是指针,*(*p)就是指向*p,*p也是指针。

*&p等价于*(&p),这里,p就是指针变量的引用,在这里&就是引用,引用就是一个别名,p就是一个指针变量的别名。

“引用定义时必须初始化,这是它与指针根本的不同”(钱能说的)。

“不能定义引用数组,不能定义指向引用的指针”(谭浩强说的)。

指针就是地址(地址的值),引用就是别名(变量的别名)。

&p出现在赋值表达式的右边的时候,&肯定是取地址运算符。

&p出现在赋值表达式左边的时候,&肯定是引用声明符(此时,它不是运算符,是声明符。

)下面用一段程序和程序的运行结果来说明他们的差别。

//指针的引用和指向指针的指针//Filename:point1.cpp#include <iostream>using namespace std;void all1(int **p)//定义一个函数,函数的参数是一个指向”指向整型变量的指针”的指针{int *pp = new int;//给指向整型变量的指针pp分配一个整型数据的内存地址*p = pp;//指针p指向的值是pp(这里pp是一个指针,指向整型数据的指针)//重点说明:pp是一个地址(指针就是地址),新分配的内存的地址cout<<"int**p:p:"<<p<<endl;//输出指针p的值(就是p所指向的地址)cout<<"int**p:*p:"<<*p<<endl;//输出指针p所指向的地址里储存的数据cout<<"int**p:&p:"<<&p<<endl;//输出指针p的地址}void all2(int*& p)//定义一个函数,函数的参数是一个指针的引用(或者说:一个指针的别名){int *pp = new int; //给指向整型变量的指针pp分配一个整型数据的内存地址p = pp;//把新分配的内存地址赋值给p(p是指针变量的引用(或者说,别名))cout<<"int*&p:p:"<<p<<endl;// 输出指针p的值(就是p所指向的地址)cout<<"int*&p:*p:"<<*p<<endl;//输出p所指向的地址里储存的数据cout<<"int*&p:&p:"<<&p<<endl;//输出p的地址}int main(){int *a1;//定义一个指针a1(最好用int *a1=NULL;防止出现野指针)all1(&a1);//调用函数all1(),参数是&a1(就是指针a1的地址)//补充说明:函数all1()的参数就是指向指针的指针(或者说:存放指针的地址)*a1 = 1;//a1指向的地址储存的数据是1//分别输出*a1,a1,&a1的值(稍后看运行结果)cout<<"\n *a1="<<*a1<<"\n a1="<<a1<<"\n &a1="<<&a1<<endl;delete a1;//释放分配给a1的内存a1=NULL;//不再使用的指针赋值为NULL,使其成为空指针,防止出现悬挂指针//分别输出a1和&a1,因为a1是空指针,使用*a会异常退出程序cout<<"\n a1="<<a1<<"\n &a1="<<&a1<<endl;int *a2;//定义一个指针a2all2(a2);//调用函数all2,函数的参数是a2(就是指针a2)//补充说明:此时在函数all2()里,a2的别名就是p,或者说p就是a2。

指针变量定义和引用指针变量定义和引用指针变量

指针变量定义和引用指针变量定义和引用指针变量

者说这个指针指向整型变量 a,也可以说是指针变量 p 指向整型变量 a 。
系统对变量访问形式分为以下两种:
(1)直接访问
按变量地址存取的变量值的方式称为“直接访问”方式。
说明:用变量名对变量的访问也属于直接访问,因为在编译后,变量名和变量地址之间
有对应关系,对变量名的访问系统自动转换成利用地址对变量的访问。如图 7.4a (2)间接访问 将变量的地址存放在一种特殊变量中,利用这个特殊变量进行访问。如图 7.4b 所示,
7.1 指针的概念
指针就是地址,指针变量是一个特殊的变量,它里面存储的数值被解释成为内存里的一 个地址。指针变量就是存放地址的变量, 要搞清一个指针需要从四个方面的内容来理解: 指针的类型,指针所指向的类型,指针的值或者叫 指针所指向的内存区,还有指针本身所占据的内存 区。
为了便于理解指针的概念,我们有必要讨论一 下计算机内存和数据的关系。我们知道,程序要装 入内存才能够运行,数据也只有装入内存才能被程 序处理,那么程序和数据在内存中的组织形式是怎 样的呢?内存又是什么样的呢?内存是计算机用于 存储数据的存储器,以一个字节作为存储单元,为 了便于访问,给每个字节单元一个唯一的编号,第 一字节单元编号为 0,以后各单元按顺序连续编号,
7.2 指针变量的定义和引用.....................................................................................................3 7.2.1 指针变量的定义和初始化......................................................................................3 1. 指针变量的定义..........................................................................................................3 2. 指针变量的初始化......................................................................................................4 7.2.2 指针变量的引用......................................................................................................4

C语言程序设计 指针变量的定义

C语言程序设计 指针变量的定义

6.1.3指针变量的定义前面提到的存放地址的变量是一种特殊的变量,它只能用来存放地址而不能用来存放其他类型(例如整型、实型、字符型等)的数据,需专门定义。

“指针”表示指向关系,所谓指针就是地址。

一个变量的指针就是这个变量的地址,存放地址的变量称为指针变量。

例如:pa 是一个指针变量,pa 中存放的是整型变量a 的地址,也就是说pa 指向变量a。

变量a 的地址就是变量a 的指针,一个指针变量的内容一定是另一个变量在内存中的地址。

定义形式为:数据类型说明符*标识符;例如:int*p;表示定义了一个指针变量p,它指向一个整型变量,即p 存放一个整型变量的地址。

说明:(1)“数据类型说明符”是指该指针变量所指向变量的类型;(2)“标识符”就是所定义的指针变量的名字;(3)定义一个指针变量必须用符号“*”,它表明其后的变量是指针变量,但不要认为“*p”是指针变量,指针变量是p 而不是*p;(4)指针可以指向任何类型的对象。

在定义了一个指针变量p 以后,系统为这个指针变量分配一个存储单元(一般为2个字节),用来存放地址。

要使一个指针变量指向某个变量,必须将该变量的地址赋给该指针变量。

例如:int a,b;int*p1,*p2;p1=&a;p2=&b;上述语句表示定义了两个整型变量a,b 和两个指针变量p1,p2,然后将a 的地址赋给p1,b 的地址赋给p2,这样p1指向变量a,p2指向变量b。

6.1.4指针变量的引用定义了一个指针变量后,可以对该指针变量进行各种操作,操作时用到两个有关指针的运算符:(1)&:取地址运算符。

(2)*:指向运算符。

例如:&a 为变量a 的地址,*p 为指针变量p 所指向的变量。

【例6-1】定义指向整型变量的指针/*程序名:6_1.c*/#include <stdio.h>&a&bp1a p2b图6-3指针的指向int main(){int a,b,*p1,*p2;scanf("%d,%d",&a,&b);p1=&a;/*p1指向a*/p2=&b;/*p2指向b*/printf("%d%d\n",*p1,*p2);printf("%d%d\n",a,b);return0;}程序运行如下:3,63636可以看出,printf(“%d,%d\n”,*p1,*p2)和printf(“%d,%d\n”,a,b)两个语句作用相同。

c语言指针表示方法

c语言指针表示方法

在C语言中,指针是一种特殊的变量,它存储的是另一个变量的地址,而不是该变量的值。

指针通过使用星号(*)来定义和操作。

1.定义指针变量:要定义一个指针变量,需要在变量名前加上星号(*)。


如,int *ptr; 定义了一个指向整数的指针变量。

2.初始化指针:可以使用赋值操作符将一个变量的地址赋给指针变量。

例如,
int num = 10; int *ptr = # 将变量num的地址赋给指针变量ptr。

3.访问指针所指向的值:要访问指针所指向的值,需要使用星号(*)操作
符。

例如,printf("%d", *ptr); 输出指针变量ptr所指向的整数值。

4.修改指针所指向的值:要修改指针所指向的值,需要使用星号()操作符。

例如,ptr = 20; 将指针变量ptr所指向的整数值修改为20。

5.指针算术:可以使用指针算术来操作指针。

例如,int arr[5] = {1, 2, 3,
4, 5}; int *ptr = arr; *ptr++; 将指针变量ptr所指向的整数值加1。

总之,C语言中的指针是一种强大而灵活的工具,但同时也需要谨慎使用,以避免出现诸如空指针、野指针等问题。

pointer indirection 指针

pointer indirection 指针

pointer indirection 指针指针间接引用(Pointer Indirection)是计算机编程中一个重要的概念。

通过指针间接引用,我们可以访问和修改指针所指向的内存地址中的值。

本文将从引言概述、正文内容和总结三个方面,详细阐述指针间接引用的相关知识。

引言概述:指针间接引用是一种在编程中常用的技术,它允许我们通过指针访问和操作内存中的数据。

指针间接引用在许多编程语言中都存在,并且在底层的系统编程中尤为重要。

下面将从五个大点出发,详细介绍指针间接引用的相关内容。

正文内容:1. 指针的定义和声明1.1 指针的定义:指针是一个变量,它存储了一个内存地址,该地址指向内存中的一个特定值。

1.2 指针的声明:在编程中,我们需要使用指针时,首先需要声明一个指针变量,并将其与特定的数据类型关联起来。

2. 指针的初始化和赋值2.1 指针的初始化:指针变量在声明时可以被初始化为空指针(null pointer),也可以指向一个已经存在的内存地址。

2.2 指针的赋值:我们可以通过将一个已存在的变量的地址赋值给指针变量,来使指针指向该变量所在的内存地址。

3. 指针的解引用3.1 指针的解引用:通过解引用操作符(*),我们可以访问指针所指向的内存地址中的值。

3.2 指针解引用的使用:解引用操作允许我们读取和修改指针所指向的内存地址中的数据。

4. 指针的指针4.1 指针的指针定义:指针的指针是指一个指针变量存储了另一个指针变量的地址。

4.2 指针的指针使用:通过指针的指针,我们可以间接地访问和修改指针所指向的内存地址中的值。

5. 指针的应用5.1 动态内存分配:通过指针间接引用,我们可以在运行时动态地分配和释放内存。

5.2 数据结构的实现:指针的间接引用为数据结构的实现提供了便利,例如链表和树等数据结构。

5.3 传递参数:通过指针间接引用,我们可以在函数之间传递参数,以便在函数内部修改传递的参数值。

总结:通过本文的介绍,我们可以看到指针间接引用在计算机编程中的重要性。

C语言指针变量的定义及指针的应用

C语言指针变量的定义及指针的应用

智者论道智库时代 ·275·C 语言指针变量的定义及指针的应用王宇博(山西农业大学,山西晋中 030800)摘要:C 语言进行编写程序一定会使用上指针,指针的操作是编写程序的一个点。

准确灵活地运用它,能够帮助我们处理实际生活中遇到的很多问题。

文章阐述了指针、指针变量以及指针运算标识符的概念,并运用实际例子介绍复杂指针的相关应用,让读者能够更加深入了解、掌握C 语言。

关键词:C 语言;指针;运用中图分类号:TP313文献标识码:A文章编号:2096-4609(2019)19-0275-002指针可以说是C 语言之中很具有特色的一个方面,另外也是C 语言学习过程中的重点以及难点。

标准、合理、正确、灵巧地运用其功能,可以用其代表繁杂的数据类型。

熟练应用指针功能,能够让程序更加简洁以及高效。

部分C 语言学习者在进行学习过程中很难对学习内容做到全部理解,致使其学习过程很艰难。

一、指针和指针变量的区别(1)“指针”是定义,“指针变量”为实际表现。

指针可以说是一种变量,因此我们可以对其进行概念化,而其概念与常见变量相同。

(2)一个变量的“指针”是指此变量的地址,借助指针可以寻找到用它来当作地址相关内存单元。

另外指针变量可以用来放置其他变量的内存地址。

(3)指针与指针变量有着不同的两个定义,需要提醒的是,一般提及指针变量时往往会将其简称为指针,但事实上两个实际含义并不相同。

二、指针变量定义在C 语言使用过程中要求所有变量先进行定义才可以进行使用,规定其类型,且依据此来区分内存单元。

指针变量与常规的整型等类型变量不完全相同的某种变量,这是一种是存放相应地址的专用变量,所以需要定义其“指针类型”。

指针变量名称的常规可见形式一般为:基种类型*指针变量名称;例如:int *i;float *j;“*”一般代表此变量的类型是指针类型。

指针变量名称是i 和j,并非*i 和*j。

在对指针变量进行定义时首先要指定其基类型。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

int *p1,*p2; float *q ; 合法标识符 指针变量本身的存储类型 指针的目标变量的数据类型 static char *name; 指针变量与其所指向的变量之间的关系
i_pointer 2000 变量i 3 *i_pointer i &i i=3; *i_pointer i_pointer *i_pointer=3
看出其地址。注意,这个地址并不是始终不变的,这 是由机器和操作系统来安排的,我们无法预先知道。
指针与地址的概念
在现实生活中,我们要给朋友写信,首先通过认识这个人得到 他的地址。但对于投递员来说,他通过投递到这个地址,找到 了这个人。
投递员
弋江区纬六路1号
寄信人
张三
根据C语言知识来说 对于寄信人来说:&张三——弋江区纬六路1号 对于投递员来说:*弋江区纬六路1号——张三 其中:“*”符号为取该地址下的内容
变量的指针和指向变量的指针变量
例3:输入两个整数,按先大后小的顺序输出。 main() { 程序运行中,指针变量p1,p2的指向变化如图 int a,b,*p1,*p2,*p; scanf(“%d%d”,&a,&b); p1=&a;p2=&b; if (a<b) {p=p1;p1=p2;p2=p;} printf(“\na=%d,b=%d\n”,a,b); printf(“max=%d,min=%d\n”,*p1,*p2); } 运行结果为: 输入:5 9 ↙ 输出:a=5,b=9 max=9,min=5
Hale Waihona Puke 指针与地址的概念例1:分析下题的输出结果: main() { int a,b,c; scanf(“%d,%d,%d”,&a,&b,&c); a=10;b=20; c=a+b; printf(“%d,%d”,c,&c,*(&c)); } 用一个变量来代替——指针变量
变量的指针和指向变量的指针变量
指针变量的定义: 一般形式: [存储类型] 例 数据类型 *指针名;
Pointer 指针 Argument 参数 declaration 声明 represent 表示 manipulate 处理
指针与地址的概念
在上机实验的时候,有没有同学曾经做过这样的试验: main() { int a,b,c; printf(“%d ,%d ,%d”,&a,&b,&c); } 运行结果为: ?
输入三个整数,按由小到大的顺序输出, 要求用指针实现
变量的指针和指向变量的指针变量
例2:通过指针变量访问整形变量。 main() { int a,b; int *p1,*p2; /*定义两个指针变量*/ a=100;b=50; p1=&a; p2=&b; /* p1指向a,p2指向b*/ printf(“%d,%d\n”,a,b); printf(“%d,%d\n”,*p1,*p2); } 运行结果: 100,50 100,50
指针变量的定义和引用
教学内容 应知指针的意义及使用 单个变量的指针应用 通过指针引用变量的意义
引例:曾经我们在学习变量的输入输出时学过以下 类似的例子 main() { int a,b,c; scanf(“%d,%d,%d”,&a,&b,&c); a=10;b=20; c=a+b; printf(“%d”,c); } 曾经说过: “&”符号为取地址符号,可以取得变量的地址。
定义指针后不经过赋值直接使用 指针与指向的数据类型不同 错用&和*
变量的存取方式有直接访问(通过变量的名 称访问变量)和间接访问(通过变量的指针访 问变量)两种 1. 变量的指针是变量的首地址 2. 指针变量用来存放变量的地址 指针变量的定义也必须要指定类型,表示指 针所要指向的变量数据类型 在使用指针变量之前,必须为其赋值,即使指 针变量指向某一个确定的值 &为取地址运算符,*为指针运算符(也叫取 值运算符)
相关文档
最新文档