C语言程序设计8n
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
s 不定
若有: 若有:
a 不定
则
int a=5, s=&a;
s &a 不定
a 5 不定
12
东北大学信息科学与工程学院自动化所
8.2 指针变量的定义和引用
(3)、注意: 对指针变量初始化
int a, *s=&a;
只能用同类型变量的地址进行赋值!
如定义:intபைடு நூலகம்*s; int *s=&a ,a; int *s=0x0001; 错误 float f; 错误 可能会把系统的资源占用而导致严重 则 s=&f;是非法的。
东北大学信息科学与工程学院自动化所 2
8.1 指针的概念
指针地位: 指针地位:
指针是C语言的一个重要概念,也是C语言的一个重 指针是 语言的一个重要概念,也是 语言的一个重 语言的一个重要概念 要特色。 要特色 。 深刻理解和正确使用指针是学习本章的基 本要求。 本要求。
指针优点: 指针优点:
直接访问内存 实现函数间的数据传递
东北大学信息科学与工程学院自动化所 4
8.1 指针的概念
二、举例
如有定义: 如有定义:char c=‘A’; 则所占内存情况如下: 则所占内存情况如下: 注意:c和a的 注意:c和a的 地址可能相邻, 地址可能相邻, 也可能不相邻, 也可能不相邻, 是由系统分配 的,我们不用 关心。 关心。
东北大学信息科学与工程学院自动化所 5
东北大学信息科学与工程学院自动化所
7
8.1 指针的概念
1、直接访问
通过变量本身对变量进行存取的方式, 通过变量本身对变量进行存取的方式,称为 直接访问。 直接访问。 如定义: 如定义:int x; 则x=10; x+=5; 等等 这种访问方式只需要变量本身就得到了该变 量的全部信息,不需要其它内容,是直接的。 量的全部信息,不需要其它内容,是直接的。
3、说明 、 a. 类型名:指针变量所指向的变量类型。 类型名:指针变量所指向的变量类型。 b. * 是定义指针变量的标志,不可丢掉。 是定义指针变量的标志,不可丢掉。 c. 指针变量定义后,其值是不确定的。 指针变量定义后,其值是不确定的。
东北大学信息科学与工程学院自动化所 10
8.2 指针变量的定义和引用
东北大学信息科学与工程学院自动化所
p1 &a2 &a1 p2 &a1 &a2
*p 1 a1
11 a2 22
*p2
17
8.2 指针变量的定义和引用
例8.3 #include <stdio.h> main( ) { int a1=11,a2=22,t; int *p1,*p2; p1=&a1; p2=&a2; printf(“%d,%d\n”,a1,a2); t=*p1; *p1=*p2; *p2=t; printf(“%d,%d\n”,a1,a2); }
用一个变量的地址初始化指针变量,变量先定义 整型数据初始化指针变量要慎重 指针初始化0
int *s=0; 赋值为0的指针不指向任何对象
东北大学信息科学与工程学院自动化所 13
8.2 指针变量的定义和引用
二、指针变量的引用
1、两个运算符:& 与 * 、两个运算符: 运算符 &:取地址,注意与作位运算符时的不同(双目) :取地址,注意与作位运算符时的不同(双目) 位运算符时的不同 注意与作乘运算符时的不同(双目) 乘运算符时的不同 *:取内容 ,注意与作乘运算符时的不同(双目) : 2、说明 、 a. &既可作用于一般变量,也可作用于指针变量 既可作用于一般变量, 既可作用于一般变量 int a,*b,*c; c=&a;c=&b; , b. * 只能作用于指针变量 int a,*b,*c, d; a=*b; d=*a; , c. 定义指针变量时的 * 与该处的含义不同
东北大学信息科学与工程学院自动化所 6
8.1 指针的概念
四、直接访问和间接访问
有两个上锁且放着物品的盒子A、B, 有两个上锁且放着物品的盒子 、 , 如果你有A盒子的钥匙,则可以直接打开 盒子 如果你有 盒子的钥匙,则可以直接打开A盒子 盒子的钥匙 将物品取出; 将物品取出; 如果你有B盒子的钥匙, 盒子的钥匙在B盒 如果你有 盒子的钥匙,而A盒子的钥匙在 盒 盒子的钥匙 盒子的钥匙在 子中,要想取出A盒子中的物品,则必须先打开B盒 子中,要想取出 盒子中的物品,则必须先打开 盒 盒子中的物品 取出A盒子的钥匙 再打开A盒子将物品取出 盒子的钥匙, 盒子将物品取出。 子,取出 盒子的钥匙,再打开 盒子将物品取出。 上面两种情况就是直接访问和间接访问的概念。 上面两种情况就是直接访问和间接访问的概念。
东北大学信息科学与工程学院自动化所 3
8.1 指针的概念
一、地址
在计算机中, 在计算机中,把内存区划分为一个一个的存储单 元,每个单元为一个字节(8位),它们都有一个编 每个单元为一个字节( ),它们都有一个编 这个编号就是内存地址。如下图所示: 号,这个编号就是内存地址。如下图所示: 注意:1、 注意:1、程序中定义的每个数据 在编译后都占有各自的内存区。 在编译后都占有各自的内存区。 2、数据所占有的存储单元个数是 、 由其类型决定的。 由其类型决定的。 3、首地址:第1个单元的地址 、首地址: 个单元的地址 4、表示地址的数与整数的区别 、
东北大学信息科学与工程学院自动化所
*p1
p1 &a1 p2 &a1 &a2
a1 11 a2 22
*p2
16
8.2 指针变量的定义和引用
例8.2 #include <stdio.h> main( ) { int a1=11,a2=22; int *p1,*p2,*p; p1=&a1; p2=&a2; printf(“%d,%d\n”,*p1,*p2); p=p1; p1=p2; p2=p; printf(“%d,%d\n”,*p1,*p2); }
东北大学信息科学与工程学院自动化所
8
8.1 指针的概念
2、间接访问
通过指针变量实现对变量的访问方式, 通过指针变量实现对变量的访问方式,称为间接 访问。 访问。 首先要定义一个指针变量,然后将一个同类型变 首先要定义一个指针变量, 量的地址赋给该指针变量( 量的地址赋给该指针变量(这时我们称指针变量指向 该变量),这样就可以进行间接访问了。 该变量),这样就可以进行间接访问了。 ),这样就可以进行间接访问了 间接访问的过程是:由指针变量得到变量的地址, 间接访问的过程是:由指针变量得到变量的地址, 根据该地址找到变量的存储区, 根据该地址找到变量的存储区,再对该存储区的内容 进行存取,从而实现了对变量的间接访问。 进行存取,从而实现了对变量的间接访问。
东北大学信息科学与工程学院自动化所 14
8.2 指针变量的定义和引用
3、指针变量可以进行的操作 、 (1)赋值:int a,*p1=&a,*p2; )赋值: (2)输出:printf(“%x”,p1); )输出: 只能和一个整数) (3)增减:p1++; p2--; p1+=4; (只能和一个整数) )增减: (4)取内容 )取内容:a=5; p1=&a; printf(“%d”,*p1); (5)若p1 = &a; 则&*p1, *&a, (*p1)++, *p1++,*++p1 ) 各自的含义。 各自的含义。
C语言程序设计 语言程序设计
主讲教师: 主讲教师:贾明兴 牛大鹏
第8章 指针 章
8.1 指针的概念 8.2 指针变量的定义和引用 8.3 指针与一维数组 8.4 指针与字符串 8.5 指针与多维数组 8.6 指针数组与指向指针的指针 8.7 返回指针值的函数 8.8 指向函数的指针 8.9 动态内存分配
东北大学信息科学与工程学院自动化所 15
p2=p1;
8.2 指针变量的定义和引用
例8.1 交换两个数 #include <stdio.h> main( ) { int a1=11, a2=22; int *p1, *p2; p1=&a1; p2=&a2; printf(“%d,%d\n”,*p1,*p2); p2=p1; printf(“%d,%d\n”,*p1,*p2); }
…... …...
东北大学信息科学与工程学院自动化所
变量a 变量b 变量x 变量y 变量temp 变量
20
例 将数从大到小输出
swap( int *p1, int *p2 ) point_1 a { int p; p=*p1; 5 &a *p1=*p2; *p2=p; 地址传递 } main() p1 &a { int a,b; int *pointer_1,*pointer_2; scanf("%d,%d",&a,&b); p pointer_1=&a; pointer_2=&b; if(a<b)swap(pointer_1,pointer_2); printf("\n%d,%d\n",a,b); } 运行结果: , 运行结果:9,5
东北大学信息科学与工程学院自动化所 19
指针变量作为函数参数——地址传递 地址传递 指针变量作为函数参数
特点:共享内存, 双向 双向” 特点:共享内存,“双向”传递 例 将数从大到小输出 (main) void swap( int x, int y ) 2000 { int temp; 5 2002 temp=x; 9 2004 x=y; (swap) 值传递 COPY 2006 y=temp; 5 9 2008 } 5 9 200A main() 5 { int a,b; scanf("%d,%d",&a,&b); if(a<b) swap(a,b); 运行结果: 运行结果:5, 9 printf("\n%d,%d\n",a,b); }
int a=3;
8.1 指针的概念
三、指针与指针变量
1、 指针 : 简单地说 , 指针就是地址 。 二者是同一 、 指针: 简单地说, 指针就是地址。 个概念的两种说法。只不过指针更形象一些, 个概念的两种说法。 只不过指针更形象一些,就像 一个针一样,可以指向某个地方。 一个针一样,可以指向某个地方。 什么是指针变量呢?我们回忆一下什么叫整型变量 什么是指针变量呢? 2、 指针变量 : 首先指针变量就是一个变量 , 和我 、 指针变量: 首先指针变量就是一个变量, 们以前所讲的其它变量没有本质区别。 们以前所讲的其它变量没有本质区别。不同之处在 于这种变量中所存放的内容是地址。 于这种变量中所存放的内容是地址。
东北大学信息科学与工程学院自动化所 9
8.2 指针变量的定义和引用
一、指针变量的定义和赋值
1、格式:类型名 *指针变量名; 、格式: 指针变量名; 指针变量名 2、举例 、 int *p1; char *s1, *s2; float *a1, *a2, f;
p1、s1、s2、a1、a2 值是地址,值得类型为整型或长整型 、 、 、 、 值是地址, p1 是指针变量,指向整型,称整型指针变量 是指针变量,指向整型, s1、s2 是指针变量,指向字符型,称字符型指针变量 、 是指针变量,指向字符型, a1、a2 是指针变量,指向浮点型,称浮点型指针变量 、 是指针变量,指向浮点型,
东北大学信息科学与工程学院自动化所
*p1
p1 &a1 p2 &a2
a1 22 11 a2 22 11
*p2
18
8.2 指针变量的定义和引用
三、指针作为函数的参数
1、形式:只需要形式参数名前加上一个*即可。 、形式:只需要形式参数名前加上一个 即可 即可。 如:void test(int *pointer, char f, char *s); ; 2、说明 、 参数的传递是值传递,单向的(从实参到形参)。 参数的传递是值传递,单向的(从实参到形参)。 那么如何理解通过指针作为参数可以改变主调函数中 变量的值呢? 变量的值呢? 形参得到实参的值(一个地址 , 形参得到实参的值 一个地址),函数中可以通过形 一个地址 参引用该地址,从而可以改变该地址对应变量的值。 参引用该地址,从而可以改变该地址对应变量的值。 但如果形参本身改变了,其值不会传给实参。 但如果形参本身改变了,其值不会传给实参。
4、赋值:可以进行初始化,也可以使用赋值语句 、赋值:可以进行初始化, (1)、初始化: 、初始化: int a, *s=&a;
(2)、赋值语句 、 int a, *s; s=&a;
东北大学信息科学与工程学院自动化所
11
8.2 指针变量的定义和引用
在分析有关指针的程序时,画图是很好的方法: 在分析有关指针的程序时,画图是很好的方法: 若有: 若有: int a, *s; 则