第6章 指针和引用

合集下载

bigC语言第12讲

bigC语言第12讲

WANGJINLING
指针是特殊类型的变量,其内容是变 合 量的地址。在使用前必须说明,说明某标 肥 识符是指针类型,并可指向某种类型的变 工 量或数据结构。
业 大 学
1、指针变量的定义 格式: type *pname1,…*pnamen;
标识符命名的指 针变量名
WANGJINLING
合 肥 指针指向对象的类型 工 int *p, *q; /* p、q是指向整型变量的指针业 */ 大 float *pfValue ,*pf; 学 /* pfValue和pf是指向浮点型的指针 */
类型长度
p1++; /*指向a后的整型单元*/ p1- -; /*指向a前的整型单元*/ p1+n; /*指向a后的n个整型单元*/
6.2 指针与数组
数组中的各元素按下标的顺序占据一段连续 的内存空间,数组名是这段连续内存的首地址, 指针访问数组元素非常方便。
WANGJINLING
6.2.1 指针与一维数组 通过指针引用数组元素有三个步骤:
指针标志
2、指针变量的赋值
① int a, *p=&a;
WANGJINLING
初始化
② int a=10,*p,*q; 注:*p=&a p=&a; 赋值语句 q=p; p=NULL
合 /*Error!*/ 肥 工 业 大 学
例:
#include <stdio.h> void main (void ) { int x ,*p; x=55; p=&x; printf ( “ %d, %u ”, x, *p) ; *p=65; printf ( “ %d, %u”, x, *p) ; }
WANGJINLING

指针与引用的区别(非常经典)

指针与引用的区别(非常经典)

c++中,引用和指针的区别(1)引用总是指向一个对象,没有所谓的null reference .所有当有可能指向一个对象也由可能不指向对象则必须使用指针.由于C++ 要求reference 总是指向一个对象所以reference要求有初值.String & rs = string1;由于没有所谓的null reference 所以所以在使用前不需要进行测试其是否有值.,而使用指针则需要测试其的有效性.(2)指针可以被重新赋值而reference则总是指向最初或地的对象.(3)必须使用reference的场合. Operator[] 操作符由于该操作符很特别地必须返回[能够被当做assignment 赋值对象] 的东西,所以需要给他返回一个reference.(4)其实引用在函数的参数中使用很经常.void Get***(const int& a) //这样使用了引用有可以保证不修改被引用的值{}引用和指针★相同点:1. 都是地址的概念;指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。

★区别:1. 指针是一个实体,而引用仅是个别名;2. 引用使用时无需解引用(*),指针需要解引用;3. 引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终” ^_^4. 引用没有const,指针有const,const 的指针不可变;5. 引用不能为空,指针可以为空;6. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;typeid(T) == typeid(T&) 恒为真,sizeof(T) == sizeof(T&) 恒为真,但是当引用作为成员时,其占用空间与指针相同(没找到标准的规定)。

7. 指针和引用的自增(++)运算意义不一样;★联系1. 引用在语言内部用指针实现(如何实现?)。

dfc6

dfc6

大连理工大学第6章指针本章要点1. 理解指针与地址的概念;2. 掌握指针的定义和运算;3. 掌握指向基本类型、数组、字符串的指针的使用;4.充分理解指针和数组的等价性;预备知识1. 内存的概念内存:就是内部存储器,是由存储单元组成的。

它的特点是存储单元是线性连续的。

存储单元的最小单位是字节。

2. 地址的概念地址:为了访问内存中的某个存储单元,我们要为它编号,这种编号称为内存地址。

通过地址我们就能够访问该地址所标识的存储单元。

变量的地址:变量的地址是变量在内存中占用连续字节的首地址。

存储单元2007变量的存取方法:直接存取和间接存取。

以往对变量的访问:•定义变量: int k;编译系统根据类型为k分配内存。

•输入变量的值:scanf(“%d”,&k);&k就代表了变量k 在内存中的地址。

•通过变量名访问变量,这种操作称为直接访问:通过指针间接访问:•C提供了另一种方式,将变量k的地址存放在另一个变量处(假定为pk),通过访问pk,就可以间接地访问变量k,这种方式称为间接访问。

引入指针程序设计的优点1.有效表示复杂的数据结构。

2.方便使用字符串、数组。

3.可以得到多个返回值。

4.可以进行动态分配内存。

5.程序简洁、紧凑, 执行效率高。

6.1.1 指针的基本概念◆指针:一个变量的地址称为该变量的指针。

◆指针变量:若一个变量专用于存放另一个变量的地址(指针),则称此变量为指针变量。

若指针变量p 的值等于变量x 的地址, 则说指针变量p 指向变量x 。

1000351000p x x 的值p 的值X 的内存地址6.1 指针和指针变量指针的对象:当把变量的地址存入指针变量后,就可以说这个指针指向了该变量。

6.1.2 指针变量的定义指针变量定义的一般形式:类型标识符*标识符[例]:int *p1;float *p2;作用:定义变量为指针类型,使之专门用于存放地址。

指针所指的变量的类型指针变量名说明:(1)“*”用于定义指针变量,但指针变量名不带*。

第6章C语言

第6章C语言

float
*point;
定义了一个指向浮点型数据的指针变量point,即point是一个 用于存放浮点型变量地址的变量。
6.1.2 指针变量的定义与初始化
在此定义中,基类型声明了该指针变量所指向的 实体的类型。如:一个指向float类型的指针变量,它 的基类型应该为float型;一个指向int类型的指针变 量,它的基类型应该为int型。“*”是一个标识,用 以说明该变量是一个具有指针类型的变量。对于指针 变量的变量名的命名也应该尽量做到“见名知义”。 需要注意的是,指针变量名为“point”,而非 “*point”。
第6章
指针
山东大学电气工程学院
第6章Байду номын сангаас指针

指针是C语言中一个非常重要的概念,它对于变量的引用、数组 的处理、字符串的操作、函数参数的调用及函数间数据的处理、 结构体的应用和文件的操作等等都起着相当重要的作用。正确的 运用指针不仅可以提高程序的执行效率,简化操作过程,而且可 以处理复杂的数据操作,实现动态的数据结构,完成形式多样的 参数传递以及灵活的修改形参与实参的数值。但是需要警惕的是, 因为指针的运用如此的灵活,以至于经常会出现一些意想不到的 错误和结果。甚至在某些情况下,错误的运用指针,会使程序受 到非常严重的破坏。因此可以说,正确的理解和运用指针是衡量 能否成功的编写高质量C程序的标准。
6.1.3 与指针有关的运算符
在C语言中有三个与指针有关的运算符: 1、“&”运算符 此运算符称为取地址运算符。通过取地址运算符“&”可以获得 一个变量的地址。“&”为单目运算符,运算方向为从右向左结合, 直接作用于一个变量前,表示该变量的地址。 例如: int x=10,*p1;

《C语言程序设计》课程教学大纲

《C语言程序设计》课程教学大纲

《C语言程序设计》课程教学大纲一、课程任务:1、课程性质:《C语言程序设计》是专业基础课,是数据结构、操作系统、面向对象程序设计等课程的前导课程,也是一门实践性很强的课程。

2、主要内容:C语言程序设计初步,算法的基本概念,常量、变量、运算符与表达式,程序控制结构,函数,编译预处理,数组,指针,结构体与共用体,位运算及文件等。

3、基本要求:通过本课程的学习,使学生了解算法的基本概念,能够比较熟练地掌握C语言的语法规则及程序设计的基本方法与编程技巧,了解进行科学计算的一般思路,培养学生应用计算机解决和处理实际问题的思维方法与基本能力,并初步积累编程经验,会根据算法编制相应的程序,并初步掌握软件开发过程的基本技巧,同时也为后继课程的学习打下坚实的基础。

二、教学内容第1章C程序设计基本知识(理论2学时,实践2学时)1.教学目的与要求:1)了解C语言的背景2)掌握C语言程序的结构3)领会C语言程序设计的风格2.教学内容:1)C程序介绍2)C程序的基本结构3)基本输入和输出方法4)C程序的上机步骤5)C程序的运行环境3.重点:1)C程序的基本结构2)基本输入和输出方法3)C程序的上机步骤4.教学难点:1)基本输入和输出方法2)C程序的上机步骤5.主要教学环节的组织:结合上机掌握C语言的运行环境,并运行一些简单的C程序6.实验初识Visual C++6.0环境及运行C( 2学时)目的和要求:1)熟练掌握在Visual C++ 6.0 IDE中创建Win32控制台应用程序的操作技能。

包括:源程序的编辑、编译、连接和执行操作2)熟练掌握项目文件的布局。

包括:新建工程、源程序及可执行程序的目录文件结构。

3)基本掌握C程序的最基本框架结构,模仿示范实例完成程序的编制与运行。

4)基本掌握发现语法错误、逻辑错误的方法以及排除简单错误的操作技能。

第2章算法及其描述(理论2学时)1.教学目的与要求:1)掌握算法的基本概念与特征2)掌握结构化程序设计的基本概念2.教学内容:1)算法的概念2)算法举例3)算法的特征4)算法的表示5)结构化程序设计方法3.重点:1)算法的概念2)N-S图3)常用算法思想。

《C语言》指针 ppt课件

《C语言》指针  ppt课件
printf(“%c”, buf[i]); }
ppt课件
14
p1 buf main
p bubfu+f105
p2 buf+10
aalllloocc
bbeeggiinn bubfu+f10 nn 150
ppt课件
1 buf[0]
2 buf[1]
:
:
9
:
\0 buf[9]
a buf[10]
:
:
\0 buf[14]
第6章 指针
6.1 指针定义与使用 6.2 指针与函数 6.3 指针与数组 6.4 指针与字符串 6.5 指针数组与多级指针 6.6 指针与动态内存分配 6.7 指针的深层应用
ppt课件
1
6.1 指针的引出
一. 地址与指针
1. 地址与取地址运算
C程序中的变量在内存中占有一个可标识的存储区,
d = *(++p) ; { ++p ; d = *p ; }
执行后 d 的值为 3 , *p 的值为 3
1010 23 a 5b 3c 3d
ppt课件
7
例6. 2
#include <stdio.h> void main( )
p1 &ba
5a
{ int *p1 , *p2 , *p , a , b ; scanf(“%d%d”, &a , &b);
p2 &ba
9b
p1 = &a ; p2 = &b ;
if (a<b) { p = p1 ; p1 = p2 ;
p &a
输出结果:
p2 = p ;

第06章 指针

第06章 指针
…...
17
高 级 语 言 程 序 设 计 与 应 用 教 程
6.3 指针和地址运算
1、指针变量的加、减运算(移动运算) 将指针变量的原值加上n个
它指向的变量所占用的内存 指针可以参与加法和减法运算,但其加、减的含义绝对 单元字节数。 不同于一般数值的加减运算。如果指针p是这样定义的: ptype *p;,并且p当前的值是ADDR,那么:
第 六 章
指 针
学习指针是学习C语言中最重要的一环, 能否正确理解 和使用指针是我们是否掌握C语言的一个标志,可以说不懂 C语言中的指针就不懂什么是C语言。
2
高 级 语 言 程 序 设 计 与 应 用 教 程
本章学习重点
指针的概念 指针变量的定义、初始化和引用 指针的运算 指针与一维数组 指针与二维数组 指针与字符串 指针作为函数的参数
第 六 章
指 针
3
高 级 语 言 程 序 设 计 与 应 用 教 程
6.1 指针与地址
1、内存地址──内存中存储单元的编号 教学楼
存储地址
内存
存储 单元
0 …... 2000 2001
601 501
602 502
50
2002 注意:内存单元的地址与内存单元中的数据是 401 402 两个完全不同的概念。 2003 存储单元有
指针变量p 2000 指针变量q 2000
第 六 章
…...
指 针
12
高 级 语 言 程 序 设 计 与 应 用 教 程
指针变量赋值的几种错误方法: 例 int *p = &a; int a;
变量a的定义在后,对a的引 用超出了a的作用域
第 六 章
注意:一个指针变量只能指向同类型的变量如果给指针赋 例 int a; 值时,=号右边的指针类型与左边的指针类型不同,则需要 int *pi = &a; pc不能指向非字符型变量 进行类型强制转换。 char *pc = &a; int a; 赋值语句中,被赋值的指针 例 int int *pi; a; 变量p的前面不能再加“*” int *p; 说明符 char *pc; *p = &a; pi = &a; //pi指向a 不允许直接把一个数(或任 pc = (char *)pi; //pc也指向了a,即pi和pc的值都是a的地址 例 int *p; 何其他非地址类型的数据) p = 2000; 赋值给指针变量

引用传递与指针传递区别

引用传递与指针传递区别

C++中引用传递与指针传递区别在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的:指针传递参数本质上是值传递的方式,它所传递的是一个地址值。

值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。

值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。

(这里是在说实参指针本身的地址值不会变)而在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。

被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。

正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。

引用传递和指针传递是不同的,虽然它们都是在被调函数栈空间上的一个局部变量,但是任何对于引用参数的处理都会通过一个间接寻址的方式操作到主调函数中的相关变量。

而对于指针传递的参数,如果改变被调函数中的指针地址,它将影响不到主调函数的相关变量。

如果想通过指针参数传递来改变主调函数中的相关变量,那就得使用指向指针的指针,或者指针引用。

为了进一步加深大家对指针和引用的区别,下面我从编译的角度来阐述它们之间的区别:程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变量名及变量所对应地址。

指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值。

符号表生成后就不会再改,因此指针可以改变其指向的对象(指针变量中的值可以改),而引用对象则不能修改。

最后,总结一下指针和引用的相同点和不同点:★相同点:●都是地址的概念;指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。

★不同点:●指针是一个实体,而引用仅是个别名;●引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”,指针可以“见异思迁”;●引用没有const,指针有const,const的指针不可变;(具体指没有int& const a这种形式,而const int& a是有的,前者指引用本身即别名不可以改变,这是当然的,所以不需要这种形式,后者指引用所指的值不可以改变)●引用不能为空,指针可以为空;●“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;typeid(T)== typeid(T&)恒为真,sizeof(T)==sizeof(T&)恒为真,但是当引用作为成员时,其占用空间与指针相同(没找到标准的规定)●指针和引用的自增(++)运算意义不一样;●引用是类型安全的,而指针不是,引用比指针多了类型检查★联系1. 引用在语言内部用指针实现(如何实现?)。

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

指向字符串的指针(续)
【例6.2】将一个已知字符串复制到一个字符数组。 1. 用下标引用数组元素方法 int k = 0; char *from = "Fudan University"; char d[100], *to=d; while(( to[k] = from[k] ) != '\0' ) k++; puts(d); /* 或使用printf ("%s\n", d) */ 2. 采用字符指针描述方法 while((*to++ = *from++ ) != '\0'); 更简洁的写法是:while(*to++ = *from++); 22
例3: j = (*ip)++; /* j=5; i=6; */
说明:先将ip所指向变量(即i)的值赋给变量j,并 让变量i自增。
相当于代码: j = *ip; *ip = *ip+1;
16
6.2 指向数组元素的指针
将数组元素的地址赋值给指针变量,就能使指针指向数 组元素。 例如:int a[100], *p; p = &a[0] /* 或写成 p = a; */ 表示:把a[0]元素的地址赋给指针变量 p, 即 p 指向数组a的第0个元素。 好处: 1. 为引用数组元素提供了一种新的途径; 2. 比用下标引用数组元素更灵活和简洁,
引用指针变量所指的变量
引用指针变量所指向的对象:* 指针变量 例如:int i=3, j, *ip, *intpt; ip = &i; /* 让ip指向变量i */ intpt = &j; /* 让intpt指向变量j */ *intpt = *ip + 5; 等价:j = i + 5; 说明:请注意指针变量之间的赋值,指针变量所指向的变量 之间的赋值,这两种赋值在表示方法上的区别。 例如:intpt = ip; 使两个指针变量intpt与ip指向同一个对象,或都不指向 任何对象(如果ip的值为NULL)。 10
相当于代码:
*ip = *ip+1;
j = *ip;
15
指针变量-说明例2、3
例2:int i = 5, j, *ip = &i ; j = *ip++; /* j=5; i=5; ip不再指向变量i */ 说明:先将ip所指向变量(即i)的值赋给变量j,然 后执行ip++,使得ip地址增加了1个单位。 相当于代码: j = *ip; ip++;
指向字符串的指针(续)
【例6.3】将字符串s中的某种字符去掉,假设要去掉的字符 与字符变量c中的字符相同。 采用一边考察字符一边复制。引入两个字符指针p和q, p指向当前正考察的字符,q指向下一个用于存储复制字符的 位置。若p所指字符与c不相同,则将它复制到新字符串。否 则,该字符不被复制。每复制一个字符q才增1,p是每考察 一个字符就增1。
因为指针运算能力强。
17
6.2 指向数组元素的指针(续)
对指向数组元素的指针允许作有限的运算 例如: int *p, *q, a[100]; p = &a[10]; q = &a[50]; (1) 两个指向同一个数组元素的指针可以作关系比较 (< ,<=, ==,>, >=, !=)。 若 p==q 表示p,q指向数组的同一个元素; p<q 表示p所指向的数组元素的下标小于q所指向的数 组元素的下标。 p>q 表示p所指向的数组元素的下标大于q所指向的数 组元素的下标。 18
20
指向字符串的指针
当指针变量指向字符串某字符时,习惯称这样的指针为 字符串的字符指针。因为字符串存储于字符数组中,所以字 符串的字符指针也是指向数组元素的指针。 为字符串常量提供存储空间有两种方法: 1. 把字符串常量存放在一个字符数组中。 例如:char s[ ] = "I am a string."; 2. 字符串常量放在程序运行环境的常量存储区中。 例如:char *cp1, *cp2 = "I am a string"; cp1 = "Another string"; 说明:字符指针指向字符串的第一个字符,即指向A。 21
第6章 指针和引用
6.1 指针基本概念
6.2 指向数组元素的指针 6.3 指针形参 6.4 数组形参 *6.5 指向二维数组一整行的指针 6.6 指针数组 *6.7 多级指针
*6.8 函数指针
*6.9 返回指针值的函数
*6.10 引用
1
6.1 指针基础概念
指针是C语言的一个重要概念。指针在程序中有以下 多方面的作用: (1) 利用指针能间接引用指针所指的对象。
6.2 指向数组元素的指针(续)
用数组名与指针的区别:
指针变量的值可改变,如 p++;数组名只代表数组首元素的 指针,是不可改变的(是常量),如 a++;是错误的。 例:利用指针遍历数组,输入生成一个数组并复制到另一个数组。 int a[100], b[100], *p, *q; for(p = a; p < a + 100;) /* 利用指针,输入数组的全部元素*/ scanf("%d", p++); for(p = a; p <= &a[99]; p++) /* 利用指针,输出数组全部元素*/ printf("*p = %d\t", *p); printf("\n"); for(p = a, q = b; p < a + 100;) /* 将已知数组复制到另一个数组*/ *q++ = *p++;
ip 1000
i 2
6
指针变量定义时指定初值
例如: int j;
int *intpt = &j; 表示:在定义 int * 类型指针变量 intpt 时,给它初 始化为 int 类型变量 j 的地址,使它指向 j。
7
指针变量定义-说明
(1) 当定义局部指针变量时,如果未给它指定初值, 则它的值是不确定的。 (2) C语言规定 0 地址记为 NULL,即表示空地址。 例如: ip = NULL; 表示:指针变量 ip 为空指针,不指向任何变量。
6.2 指向数组元素的指针(续)
(2) 指向数组元素的指针可与整数进行加减运算 由于数组元素在内存中顺序连续存放,因此表达式a+1为 a[1]的地址,a+2为a[2]的地址。 若指针 p = &a[0]; 则表达式 p+i 的值为 a[i]的地址。或者 说,p+i的值为指向a[i]的指针值。 (3) 引用数组元素的方法 1. 用数组元素的下标法,例如:a[5]、a[i]。 2. 利用数组名,例如: *(a+i)表示a[i]。 3. 利用指针变量,例如: p = &a[0]; 则 *(p+i)表示a[i]。 *(p+i)也可写成p[i]。 19
指针变量和它所指向的变量
取变量地址运算符: &
例: &x 表示取变量x的地址 说明: 1. 变量的地址也可作为一种值被存储和运算。 2. 除能按名引用变量外,也可利用变量的地址引 用变量。按变量名引用变量习惯称为直接引用, 而将变量A的地址存于另一变量B中,借助于变 量B引用变量A称为对A的间接引用。
100
ip
i
100
intpt
j
200
intpt
j
100
(a) 赋值前
(b) 赋值后 13
指针变量所指变量之间赋值
指针变量-说明
(1) 定义指针变量与间接引用指针变量所指对象采用 相似的标记形式(* 指针变量名),但它们的作用与 意义是完全不同的。 例如:int i,*ip = &i;
*ip = 5; /* 等价 i = 5; */ (2) 凡能直接按变量名可引用的地方,也可以用指向 它的某个指针变量间接引用它。 例如:int i, *ip = &i;
(2) 指针能用来描述数据之间的关系,以便构造复杂数据 结构和处理动态数据结构问题。
(3) 利用指针形参,能使函数间接引用调用环境中的变量。 (4) 指针与数组结合,使访问数组元素的方式更加多样、 手段更加灵活。
(5) 熟练正确应用指针,能写出紧凑高效的程序。
2
变量、变量的地址及变量的值
程序在计算机上运行时,程序中的变量会在内存中占 据由若干字节组成的一个内存储块,用于存放变量的值。 存储块的开始地址称为变量的地址。 程序用变量的名引用变量的值或变量的地址。 例如: int x = 1; x = x + 2; 在代码“x = x+2;”中,赋值号左边的 x 表示将存入变 量 x,赋值号右边的 x 表示引用变量 x 的值。该代码的意义 是“完成取x的值,加上 2 的计算,并将计算结果存入变量 x 中。” 3
(3) 指针变量只能取程序对象的地址值,不能将任何 其他非地址值赋给指针变量。 (4) 一个指针变量只能指向同一个类型的变量,不能 一会儿指向整型变量,一会儿指向实型变量。
8
指针变量定义-说明
例如:int i = 100, j, *ip, *intpt; float f, *fp; 以下都是不正确的赋值: ip = 100; /* 指针变量不能赋整数值 */ intpt = j; /* 指针变量不能赋整型变量的值 */ fp = &i; /* 只能指向float型变量,不能指向int型变量 */ fp = ip; /* 不同类型的指针变量,不能相互赋值 */ 以下都是正确的赋值: ip = &i; /* 使 ip 指向 i */ intpt = ip; /* 使 intpt 指向 ip 所指变量 */ fp = &f; /* 使 fp 指向 f */ ip = NULL; /* 使 ip 不再指向任何变量 */ 9
相关文档
最新文档