c语言中指针用法PPT汇编

合集下载

《C语言程序设计》第8章指针

《C语言程序设计》第8章指针
}
10.3.3 指针变量和数组作函数参数 数组名作形参时,接收实参数组的起始地址;
作实参时,将数组的起始地址传递给形参数组。
引入指向数组的指针变量后,数组及指向数 组的指针变量作函数参数时,可有4种等价形式 (本质上是一种,即指针数据作函数参数):
(1)形参、实参都用数组名 (2)形参、实参都用指针变量 (3)形参用指针变量、实参用数组名 (4)形参用数组名、实参用指针变量
(4)指针变量的++、--与&、*的结合
对于指针变量的++、--与&、*的结合 使用,关键要注意按照运算符的优先级和 结合性进行。
例如: int a=2, *p; p=&a;
•表达式:(*p)++,按运算符的优先级,等价于 a++。其含义为:取出指针变量p所指向的内存单 元的值(即a的值),a的值加1,送回a的内存单 元,a的值变为3,p的值未发生变化,仍然指向 变量a。
程序说明:printf("%s\n",s);语句 通过指向字符串的指针变量s,整体引
用它所指向的字符串的原理:系统首先输出s 指向的第一个字符,然后使s自动加1,使 之指向下一个字符;重复上述过程,直至遇到 字符串结束标志。
main() { char string[ ]=”I love Beijing.”; printf(“%s\n”,string); }
3.数组元素的引用 数组元素的引用,既可用下标法,也可用
指针法。
10.3.2 通过指针引用数组元素 如果有“int a [10],*p=a;” ,则: (1)p+i和a+i都是数组元素a [i]的地址。
(2)*(p+i)和*(a+i)就是数组元素a [i]。 int a [3]; a [0]——*a a [1]——*(a +1) a [2]——*(a +2)

全的C语言指针详解PPT课件

全的C语言指针详解PPT课件

在函数中使用指针参数
03
使用指针参数来访问和修改指针所指向的内容,需要使用“-
>”或“*”运算符。
05
指针的高级应用
指向指针的指针(二级指针)
定义与声明
二级指针是用来存储另一个指 针的地址的指针。在声明时, 需要使用`*`操作符来声明二级
指针。
初始化与使用
通过使用`&`操作符获取一个指 针的地址,并将该地址存储在 二级指针中。然后,可以通过 二级指针来访问和操作原始指
当使用malloc或calloc等函 数动态分配内存后,如果 不再需要该内存,必须使 用free函数释放它。否则, 指针将指向一个无效的内 存地址。
当一个指针在函数中定义 ,但该函数返回后仍然存 在并继续指向无效的内存 地址时,就会产生野指针 。
避免指针越界访问
总结词:指针越界访问是指试图访问数 组之外的内存,这是不安全的,可能会 导致程序崩溃或产生不可预测的结果。
指针与内存分配
通过指针来访问和操作动态分配的内存空间。指针可以 存储动态分配的内存地址,并用于读取和写入该地址中 的数据。
指向结构体的指针
01
定义与声明
指向结构体的指针是指向结构体类型的指针。在声明时,需要使用结
构体类型的名称来声明指向结构体的指针。
02 03
初始化与使用
通过使用`&`操作符获取结构体的地址,并将该地址存储在指向结构 体的指针中。然后,可以通过该指针来访问和操作结构体中的成员变 量。
```
பைடு நூலகம்
指向数组元素的指针
• 指向数组元素的指针是指向数组中某个具体元素的指针。通过将指针指向数组中的某个元素,可以访问该 元素的值。
• 指向数组元素的指针可以通过定义一个指向具体元素的指针来实现。例如,定义一个指向数组中第三个元 素的指针,可以使用以下代码

c语言第10章指针

c语言第10章指针

3.间接引用指针
间接引用指针时,可获得由该指针变量所指向的变量内容。
例如,int i=10,*ip=&i;
ip
i
cout<<*ip<<endl;
0000:F384 0000:F384 210
运行结果为:10 即指针ip所指向的变量i的内容。
*放在定义过的指针变量之前,称为间接引用操作符; *放在指针变量定义中时,称为指针定义符。 非指针变量不能用间接引用操作符,*只能作用于地址。
例如, double d=1.23,*dp; char c,*cp;
在&和cp*=作&d用; 下,对变量d和dp有如下6种操作: 其d,中d,dpp,=*&d*是cd; ,非*法dp的,;&&d指,dp针&是只d指p能。针指的向地与址其即同二类级型指的针量。 另外,指针除了可指向所有基本类型的变量外,指针也可 指向常量、数组、数组元素、函数、指针以及文件等。
int ii=n1t0;b, a[10]; int *inpt=&*pi;1,//*初p2始; 化为整型变量的地址,但 *ip=p&1=i;&//是b;错误的
注意:p2不=p要1将; “//可in以t *将ip=一&个i;”已与赋“值*i的p=指&i针;”混赋淆给。另一个相同类型的指针 前者是p2定=&义a语[5句];,*是指针定义符,系统为指针变量ip分配一个空间, 并2、用i数的地组址的值地初址始值化;可后用者该是数执组行语的句数,组左名右表两边示类。型例不如匹:配。 指 例3、针如变,ip函n=d*d量t数bodob;up在u的b=b[3使ll6ee].地8[用*d;4d=址]前/p2,/!(;.,*5值;p一)由[定4该]要; 函被数$赋$$以的d$:p一$名$个$字$地来址表值$$$,示$:否$。$$则$例是如很#6某#:危.#8变险量的。 没有被do赋ub值le的s指in针(d变ou量bdlep的x值);是一个随机地址,把6.8赋给内存中的 随机位do置ub,le很(可*p能f)破( 坏); 了另一个变量,甚至修改了栈中的函数返回 地址,pf造=s成in计; 算机死机或进入死循环。

软件技术基础之指针和结构体课件ppt课件

软件技术基础之指针和结构体课件ppt课件


从右图可知,指 针变量和一般变量一 指针变量pi 变量地址(指针)
量 地 址
样,仅仅是变量旳内




容为变量地址旳变量
变量i
变量值

而已。这里变量和指针变量旳类型必须一致。
针 变

一般而言,指针变量只能存储某一种数据类型旳 变量旳地址,由此可将指针变量分为:整型指针变量、 实型指针变量和字符型指针变量等等,指针变量旳类 型表白了其指向旳存储单元中存储旳数据旳类型。
另一种引用旳形式: 构 造指针变量名 组员名 定义:struct data * today; today 为指向该构造旳指针
可见,“”和“·”操作符分别使用在用指向构造旳 指针和用构造变量来访问构造中旳数据项(组员)时。
例:构造例程。
结 构 体小结
构造体是C语言中旳一种复杂(构造)类型,它是一种 被命名为一种标识符旳多种变量旳集合。构造旳定义拟定了 构造变量或构造指针旳格式,构造是软件设计中实现数据抽 象旳基础。
3、程序中一旦定义了一种变量,该变量在内存中就将 占用一定旳存储单元。变量占用旳存储单元总是n(n>0) 个连续旳字节,开始字节旳地址,就是变量旳地址也可 称为该存储单元旳首地址。
二、指针旳基本概念:
指针就是变量旳地址。与此相应,在C语言中使
用一类专门旳变量即指针变量来存储变量旳地址。
所以,指针变量是存储地址数据旳变量。
四、指针旳“&”、“*”和赋值运算:
1 、& 取地址运算和 * 引用运算 取地址运算符&旳作用是取变量旳地址。如:
& i 表达求变量 i 旳地址。 引用运算符 * 旳作用是取指针指向变量旳内容。

C语言指针详解

C语言指针详解

C语言指针详解1 程序如何运行当我们打开电脑中的任何一个程序运行时,我们的操作系统会将该程序存在硬盘的所有数据装载到内存中,然后有CPU 进行读取内存中的数据并进行计算,并将计算的结果返回给我们的操作系统,然后操作系统将相应的动作交付给相应的硬件来完成。

如:将声音数据交给声卡,最后有音响输出来,将图像交给显卡最后有显示器输出……但是还会有一部分数据会返回给内存,以供程序下面的语句继续使用。

我们都知道内存的容量有很大,如:4G,8G, 16G,有时候我们会打开很多的程序,所有的程序的数据都存放到我们的内存中,那么CPU是如何正确的读取我们的不同程序的数据并加以计算的哪?2 内存的假设设计为了让我们的CPU 可以很好的读取内存中的数据,内存必须做优化设计,于是给内存设定了集合设计,将我们的内存分成很多大小相同的方格(盒子),所有的数据将放入这些小盒子中,将不同的程序的数据放入到不同的小盒子中,这样就出现的模块化的内存,当我执行程序的一个命令时,CPU就会从相应的盒子读数据然后计算,由于我们硬件所能访问或计算的最小单位是字节,所以内存中的这样的一个小盒子的大小就给他规定一个字节。

3 地址和指针一般我们声明一块内存空间的时候,会给他取一个名字,为的是我们在编写程序的时候方便使用空间中存放的值,但是CPU 读数据的时候会忽视这个名字,因为CPU无法理解这样的数据,CPU 只能执行0,1代码,那么CPU是如何知道从什么地方读取数据,又到什么地方地址数据的读取的那,所以必须对内存做2次设计,就是将内存中分成的很多小盒子下面标注一些顺序的序号,例如:从第一个盒子开始,标注1,2,3,4,5,6,7,……每一个数字对应一个盒子,但是真正的内存如中不是使用这些十进制数字的,而是使用16进制整数表示的,如0x16ffee。

这些我们标记的数字就叫做内存中的地址。

由于这些地址和盒子是对应的关系,所以只要知道了地址,就可以得到对应盒子中存放的数据了,形象的说,我们说这个地址指向对应的盒子,在C语言中可以通过地址得到对应盒子的数据是*地址。

C语言指针讲解ppt课件

C语言指针讲解ppt课件
scanf(″%d,%d″,&a,&b); p1=&a;p2=&b; if(a<b) {p=p1;p1=p2;p2=p;} printf(″a=%d,b=%d\n\n″,a,b); printf(″max=%d,min=%d\n″,*p1,*p2); }
运行情况如下: 5,9↙ a=5,b=9 max=9,min=5 当输入a=5,b=9时,由于a<b, 将p1和p2交换。交换前的情况见图 (a),交换后见图(b)。
地址。
10.2.2 怎样引用指针变量
在引用指针变量时,可能有三种情况: ⑴给指针变量赋值。如:
p=&a; ⑵引用指针变量的值。如:
printf(“%o”,p); ⑶引用指针变量指向的变量。
有关的两个运算符: (1) & 取地址运算符。 &a是变量a的地址。 (2) * 指针运算符 (或称“间接访问”运算符),*p
1 2 3 4 5 6 7 10 9 0↙
1 2 3 4 5 6 7 10 9 0
10.3.4 用数组名作函数参数
在第7章中介绍过可以用数组名作函数的参数。 如: void main()
{if(int arr[],int n); int array[10]; ┇ f(array,10); ┇ } void f(int arr[ ],int n)
{ ┇
}
例10.7 将数组a中n个整数按相反顺序存放
#include <stdio.h> void main() { void inv(int x[ ],int n);
int i,a[10]={3,7,9,11,0, 6,7,5,4,2};
printf(″The original array:\n″); for(i=0;i<10;i++) printf (″%d,″,a[i]); printf(″\n″); inv (a,10); printf(″The array has been in verted:\n″); for(i=0;i<10;i++) printf (″%d,″,a[i]); printf (″\n″); }

《C语言》指针--ppt课件全文

《C语言》指针--ppt课件全文

说明: 这种方法可能会破坏系统的正常
工作状态,因为temp是一个指针变量 b 59
但是在函数中并没有给temp一个确定 的地址,这样它所指向的内存单元是 不可预见的,而对*temp的赋值可能 带来危害
swap2 &a p1
&b p2 随机值 temp
5?
ppt课件
11
例 6. 3 ③ #include <stdio.h> void swap3( int *p1, int *p2) { int *p;
p
*p = 12 ; printf (“%d\n” , *p ) ;
对a 重新赋值 等价于 a=12
2. & 与*
p =ห้องสมุดไป่ตู้&a ;
1010 152 a
&*p &(*p) &a *&a *(&a) *p a
ppt课件
6
3. *与 ++ , - -
int a = 2 , b = 5 , c , d , *p ; (1) p = &a ;
② 形参表列: 即指针变量所指向的函数的形参表列 ③ 格式中的小括号不能省略 2. 应用 (1) 让指针变量指向函数 pt = add ; 因为函数名为函数的入口地址, 所以直接将函数名 赋给指针变量即可 (2) 使用指针变量调用函数 格式 : (*指针变量名) ( 实参表列)
ppt课件
17
例 求一维数组中全部元素的和
因此我们可以定义一个指针变量, 让它的值等于 函数的入口地址, 然后可以通过这个指针变量来调用 函数, 该指针变量称为指向函数的指针变量
ppt课件
16
指向函数的指针变量

指针ppt课件

指针ppt课件

可以通过将数组名赋值给指针变量来 初始化数组指针,例如 int *p = arr; 其中 arr 是数组名。
指向数组的指针
指向数组的指针的概念
指向数组的指针是指向整个数组的指针,可以通过将数组 名赋值给指针变量来获取整个数组的首地址。
指向数组的指针的初始化
可以通过将整个数组名赋值给指针变量来初始化指向数组 的指针,例如 int (*p)[5] = &arr; 其中 arr 是包含 5 个整 数的数组。
指针乘法和除法
指针的乘法和除法运算在实际编程中很少使用,因为它们的意义不太 明确。
指针的关系运算
01
关系运算符
包括大于(>)、小于(<)、大于等于(>=)、小于等于(<=)等
。这些运算符可以用于比较两个指针所指向的内存地址的大小关系。
02
大于和小于运算
比较两个指针所指向的内存地址的大小,如果第一个地址大于第二个地
06 指针的高级应用
动态内存分配
动态内存分配的概念
动态内存分配是指在程序运行时,根据需要动态地分配或释放内 存空间的过程。
动态内存分配的方法
常见的动态内存分配方法有malloc、calloc、realloc和free等函数 。
动态内存分配的注意事项
在动态内存分配时,需要注意内存对齐、内存碎片化、内存泄漏等 问题,以确保程序的正确性和稳定性。
二叉树操作
二叉树的概念
二叉树是一种树形数据结构,每个节点最多有两个子节点,通常称为左子节点和右子节点 。
二叉树的创建与遍历
二叉树的创建需要为每个节点分配内存,并设置左子节点和右子节点的指针;二叉树的遍 历包括前序遍历、中序遍历和后序遍历等,需要遵循二叉树的结构和特性进行操作。

第十章 指针指针是C语言中广泛使用的一种数据类型. 运用指针.

第十章 指针指针是C语言中广泛使用的一种数据类型. 运用指针.

int *p; p=1000;
被赋值的指针变量前不能再加“*”说明符,如写为*p=&a 也是 错误的。
3、指针变量的引用
欲穷千里,更上层楼
两个指针运算符: (1)取地址运算符:& (2)取内容运算符:*
例如: &a为变量a的地址,*p为指针变量p所指向的变 量
#include ”stdio.h”
#include “conio.h”
表示对数组元素a[2]赋以值1
C规定p+1指向下一个元素(实际含义为p+1*d,d为一个数组元素 所占字节数)
如果p的初值为&a[0],则:
p+i和a+i就是a[i]的地址,或者说它们指向a数组的第i元素
*(p+i) 或*(a+i)是p+i或a+i所指向的数组元素,即a[i]。
p a数组
a[0]
p+1,a+1
a[1]
p+i,a+i
*(p+i)
a[i]
p+9,a+9
a[9]
欲穷千里,更上层楼
p,a,&a[0]均指向同一单 元,它们是数组a的首地 址,也是第0 元素a[0]的 地址。
p+1,a+1,&a[1]均指向 第1元素a[1]。类推可知 p+i,a+i,&a[i]指向第i元素 a[i]。
应该说明的p是变量, 而a,&a[i]都是常量。在 编程时应予以注意。
2)在讲述一维数组时候我们曾经提到: 因为: a[i]和*(a+i) 等价! 所以: a[i]+j= =*(a+i)+j= =&a[i][j]

C语言第8章 指针

C语言第8章 指针
数据类型 *函数名(形参表) { 函数体; }
例8-13 求最长字符串。
函数的返回值为指针,指针数组作函数参数。
8.5.2 执行函数的指针变量(P207)
P207 自学
8.6 指针应用举例 (P208)
P208 自学
8.7 动态内存管理 (P214)
动态分配存储空间
malloc( )函数 calloc( ) 函数
2. 变量地址示意图
变量 b 的地址:XXXX 变量b 4字节
例: float b; char c;
变量 c 的地址:XXXX 数组 a 的地址:XXXX
变量c 1字节
int a[2];
数组a 8字节
变量的地址示意图
8.1.1 指针和指针变量(P185)
指针
变量的存储地址称为该变量的指针。
指针变量
for (i=0;i<4;i++)
p[i]=&a[i*3]; printf ("%d\n",p[3][2]);
8.4 指针作为函数的参数 (P199)
指针变量 ① 形参是指针变量,对应实参是 变量地址 数组名 指针变量 ② 形参是数组名,对应实参是 变量的地址 数组名
8.4.1 指针作参数示例
例8-10 两数交换。形参为指针变量,实参为变量
char *p="abcd";
读下列程序段,分析输出结果
(1)
char s[]="ABCD";
char *p; for (p=s; p<s+4; p++) printf("%s\n",p);
读下列程序段,分析输出结果

67全国计算机等级考试实用应试教程二级C语言 第8章 指针PPT课件

67全国计算机等级考试实用应试教程二级C语言 第8章  指针PPT课件
9
(2)通过指针变量获得地址值 可以通过赋值运算,把一个指针变量中的地址
值赋给另一个指针变量,从而使这两个指针变量 指向同一地址。例如,若有以上定义,则语句:
p=q; 使指针变量p中也存放了变量k的地址,也就是 说指针变量p和q都指向了变量k。 注意:在赋值号两边指针变量的基类型必须相同。 (3)通过标准函数获得地址值 可以通过调用库函数malloc和calloc在内存中开 辟动态存储单元,并把所开辟的动态存储单元的 地址赋给指针变量。
10
8.3.2 给指针变量赋“空”值 除了给指针变量赋地址值外,还可以给指针变
量赋NULL值。 例如:p=NULL; NULL是在stdio.h头文件中的预定义符。NULL
的代码值为0,当p=NULL时,称p为空指针。因 为NULL的代码值是0,所以上面语句等价于:
p=’\0’; 或 p=0; 这时,指针p并不是指向地址为0的存储单元, 而是具有一个确定的值——“空”。企图通过一个 空指针去访问一个存储单元时,将会得到一个出 错信息。
(2)*&a的含义是a。因为先进行&a运算,得到a的 地址,再进行*运算,即&a所向的变量,因此*&a 等价于a。
(3)(*p)++相当于a++。注意括号是必要的,如果 没有括号,就成为*(p++),这时使指针变量本身 增1,并不是使p所指的存储单元的值增1。
13
2.通过指针引用存储单元 例如: int *p, k=4, q; p=&i; 则赋值语句 q=*p; 就是把p所指存储单元(k)的内容(整数4)赋 予变量q,这里的*p代表p所指向的变量i。因此, 上面的语句等价于 q=k;
2

C语言程序设计——指针(完整版)PPT教学课件

C语言程序设计——指针(完整版)PPT教学课件

说明:
(1)设有指向整型变量的指针变量p,若要把整型变量a 的地址赋予p,有以下方式: 指针变量初始化的方法: int a; int *p=&a; 赋值语句的方法: int a,*p; p=&a; (2)指针运算符*和指针变量说明中的指针说明符*不是 一回事。后者表示其后的变量是指针类型,前者则是一 个运算符用以表示指针变量所指的变量。
三、 指针变量作函数参数 C语言是通过传值将参数传递给函数的,对被调函数来说, 没有直接的方法来改变主调函数内的变量的值。 例:对两个整数按大小顺序输出。 #include<stdio.h> swap(int x,int y) {int t; t=x; x=y; y=t; } void main( ) {int a=3,b=5; if(a<b) swap(a,b); printf(“a=%d,b=%d \n”,a,b); }
说明:
(1)指针变量名的构成原则是标识符,前面必须有 “*”, 表示该变量的类型是指针型变量。 (2)在一个定义语句中,可以同时定义普通变量、数组、 指针变量。 (3)类型说明符说明的数据类型不是指针变量中存放的 数据的数据类型,而是它将要指向的变量或数组的数据 类型。因此,一个指针变量只能用来指向同种数据类型 的其他变量或数组,不能时而指向一个浮点型变量,时 而指向一个整型变量。
说明:
(3)如果已执行了语句p=&a; ,则: &*p:先进行*p的运算,即是变量a,再执行&运算, 即变量a的地址。因此&*p与&a相同。 *&a:先进行&a的运算,即得a的地址,再执行*运 算, 即&a所指向的变量,即变量a。 因此*&a与a相同。

C语言程序设计课件第06章数组、指针与字符串.ppt

C语言程序设计课件第06章数组、指针与字符串.ppt
pa+i)就是a[i]. –a[i], *(pa+i), *(a+i), pa[i]都是等效的。 –不能写 a++,因为a是数组首地址(是常量)。
17
指针数组
指 数组的元素是指针类型 针 例:Point *pa[2];
由pa[0],pa[1]两个指针组成
*i_pointer 3i
2000
9
指针变量的初始化
指 语法形式 存储类型 数据类型 *指针名=初始地址; 例:int a , *pa=&a;
针 注意事项
➢用变量地址作为初值时,该变量必须在指针初始化 之前已说明过,且变量类型应与指针类型一致。
➢可以用一个已赋初值的指针去初始化另一个指针变 量。
组 ➢ 数组下标从零开始。 ➢ 下标必须是整形表达式。 ➢ 数组元素可以在定义时直接给出初始值列表。 ➢ 数组元素作函数参数同简单变量作函数参数。 ➢ 数组名作函数参数传递的是地址值。 ➢ 二维数组在内存中按行存放。
4
对象数组
数 声明:
类名 数组名[元素个数];
组 访问方法:
数组名[下标].成员名
与!=的关系运算。

– 指向不同数据类型的指针,以及指针与一
般整数变量之间的关系运算是无意义的。
– 指针可以和零之间进行等于或不等于的关
系运算。例如:p==0或p!=0
16
指向数组元素的指针
指 声明与赋值
例:int a[10], *pa;
针 pa=&a[0]; 或 pa=a;
通过指针引用数组元素
C++语言程序设计
第六章 数组、指针与字符串
本章主要内容
数组 指针 动态存储分配 深拷贝与浅拷贝 字符串

大学C语言实用教程(课件)-第6章-指针

大学C语言实用教程(课件)-第6章-指针

int *p=&a;
// p指向a
printf("a=%p b=%p c=%p p=%p\n",&a,&b,&c,&p); printf("p=%p *p=%d\n",p,*p);
p--;
}
// p指向a前面的存储单元
printf("p=%p *p=%d\n",p,*p);
2. 指针与整数相加减 指针加减一个整数n可以使指针移动,可以访问新地址。
char c= 'A',*pc=&c; float a=3.0,*pa=&a;
指针变量指向变量示意图
pa FF74 FF70 FF71 FF72 FF73 FF74 a 3.0 FF75 FF76 FF77 FF78 pc FF7C FF79 FF7A FF7B c A FF7C
② 赋值方法 先定义指针,然后用赋值语句将所指变量的地址赋给它。例如 char c,*pc;
4. 两个同类型指针相减
x[0]
如果两个同类型指针之间所存储的数据的 x[2] 类型也与指针相同(通常是数组的情况),则相 减的结果是这两个指针之间所包含的数据个数。 x[3]
x[4]
x[1]
【例】两个同类型指针相减。 #include <stdio.h> void main() { float x[10]; float *p,*q; p=&x[2]; q=&x[8]; printf("q-p=%d\n",q-p); }
6.1.2 指针和指针变量
1.指针和指针变量的概念
变量的指针:该变量在内存中的地址。 指针变量:专门用来存放变量地址的特殊变量。 在不致引起混淆的情况下,把指针变量简称为指针。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

例6-1 分析下面的变量说明语句和赋值表达式:
int *point1,a=123,b=567; double point2[20]; …… point1=&a; point1和point2都是指针;
执行point1=&a操作后,point1存放变量a的地 址,它指向变量a 的存储空间。如下图所示: point1 变量a的地址 a 123
( 2 )指针变量可以和其它变量在同一语句中声 明。 例如: double d1,*d2; ( 3 )指针变量只能存放相同基类型数据对象的 内存地址,换句话说,一个指针变量在任何时候 都只能指向同一基类型的数据对象。 这就是所谓“指针类型与实际存储的匹配” 问题 ,例如: char *c; int i; …… c=&i;
上面的说明语句在声明指针变量iptr的同时即 赋予初值,其初值是i的地址。 也即iptr指向整型变量i,对于iptr的引用(可 以表示成*iptr)也就是对i的引用。
5.几点说明
(1)标识符前面的“*”并不是名称的一部分, 而表示该数据对象的类型为指针类型,也即声 明该数据对象是指针类型数据对象。
错误的赋值,因为c只能指向字符串。
6.3 指针运算
指针运算实际上是地址操作,包括算术运 算(加减运算)、关系运算、赋值以及取地址 和间接访问等。
1.指针的赋值
操作指针之前必须赋予确定的值,可以在 定义指针的同时赋予初值,也可以用赋值表达 式对指针变量赋值。 (1)赋空值(NULL); (2)赋予某个变量的地址。 (3)将一个指针变量的值赋予另一指针变量。 例如:int grade,*p; p=&grade;
3.指针类型
指针类型属于非标准类型,其取值是所表示 的数据对象的内存地址,所以其值域是内存地址 集。
指针类型用来定义各种类型的指针变量,例 如整型指针、字符指针等等。其语法如下:
<类型标识符> * 类型标识符,是指针类型的基类型,也即指针 所指向的数据对象的类型。
*,作用在各个标识符上,表示该标识符所标识 的变量是指针变量。
2. 指针的作用
(1) 实现复杂的数据结构,例如数组、链表、 队列和堆栈等; (2)能方便地表示和处理字符串; 例如: char s1[20]={‘a’,’b’,’\0’},*sp1; sp1=s1;//s1和sp1都代表字符串 “ab” (3) 实现动态存储分配; 对于程序中所包含的大存储量的数据对象, 一般用预先定义的指针变量来表示,当实际使用 时才临时申请实际的存储空间,使用完毕立即释 放。
s2,s3两者的关系如下图所示:
s2
s3
abcd
s4是字符型指针数组,最多可以存放100个字 符串的指针(地址),也即每一个元素都可能指 向一个字符串,如下图所示:
可以看出,一个一维字符指针数组可以表 示一个n行m列的的文本,它是特殊的二维字符 数组。
4. 指针变量的初始化
我们可以在定义指针变量的同时给其赋初值, 指针的初值是某个数据对象的内存地址,也即使 得该指针指向对应的数据对象。 这一过程也称为建立指针。 例如: int i=10; int *iptr = &i;
第六章 指针
指针是C++ 提供的一种颇具特色的数据类 型,允许直接获取和操纵数据地址,实现动态 存储分配。 指针是C和C++的精华所在,也是C和C++的 一个十分重要的概念。
主要内容:
指针的概念; 指针数据对象及其定义; 指针运算;
指针数据对象的引用;
利用指针实现动态存储分配(动态数组)
2.指针变量的作用域
指针变量也有全局和局部之分: 在函数外部声明的指针变量是全局的;在函 数内部声明的指针变量是局部于该函数的。
3.实例
例6-3 在函数中声明三个变量x,y,z,其中x、y是整 型指针,z是整型变量,对应的语句如下: int *x, *y,z; 例6-4 分析和比较语句char s1,s2[100],*s3,*s4[100];数据对 象的存储空间相比实在是微乎其微,因为它只是 用来存放对应空间的首地址,而不是存放数据本 身,所以可以节省大量的存储空间,提高内存空 间的利用率。
(4) 在函数之间进行数据的双向传递。
将形参定义成指针类型,对应的实参必须是 某个数据对象的地址或首地址,也即采用传地址 的方式,这样就可以实现数据的双向传递。
指针类型定义和指针变量声明是同时进行的。 例 6-2 分析说明语句:int *a,b;。 该语句既定义了整型指针int *,同时又声明了 整型指针变量a和整型变量b。
6.2 声明指针变量 1. 指针变量
所谓指针变量就是类型为指针类型的变量。 用变量说明语句来声明指针变量,其语法如下: <类型标识符> *<标识符1>,*<标识符2>,……, *< 标识符n>; 解释: 类型标识符:用来指明指针类型的基类型,可 以是基本类型,例如int,char,double等等,也可以 是结构类型,例如数组、结构体、文件等等。 标识符:标识指针数据对象,被标识的对象可 以是基本变量、数组、结构体变量、函数等。
point2是数组名,又是指向数组第一个元素的 指针,如下图所示: point2 双精度型数组的存储空间 point2数组的首地址
注意:指针中的内容是可以动态改变的,例如 point1原来指向变量a,当执行了point1 = &b操作 后,即指向变量b: point1 变量b的地址 b 567
重点:
指针的概念
指针运算;
内存操作函数和动态存储分配。
课堂时数:6—7学时 上机时数:2—3学时 课外上机时数:2—3学时
6.1 指针的概念
1. 什么叫指针
一个数据对象的内存地址称为该数据对象 的指针 。 指针可以表示各种数据对象,例如:简单 变量、数组、数组元素、结构体甚至函数。
换句话说:指针具有不同的类型,可以指向 不同的数据存储体。
上面的语句定义了四个变量: s1是字符型变量,用来存放单个字符 ;
s2是字符数组,最多可以存放100个字符;
s3是字符型指针变量,用来存放字符数据的内存地 址或字符串的首地址。如果其中存放的是字符串的 首地址,则它指向一个字符串,或者说它代表一个 字符串; 例如,执行如下的操作序列后,则s2等价于s3: strcpy(s2,"abcd"); s3=s2;
相关文档
最新文档