c语言程序设计--指针
C语言程序设计实训教程第7章 指 针

12
2)指针与一维数组 【例 7.6】 下列程序的运行结果是( )。[读 程序写结果,重庆市 2001年第 2次等级考试]
13
14
3)指向字符的指针
15
16
17
18
4)指针与二维数组
19
5)指向一维数组的指针(行指针) 【例 7.18】 对 int(﹡p)[5];的正确描述 是( )。[多选题,重庆市 2003年第 1次等级考 试] A. p是数组名 B. p是指针变量名 C. p数组中有 5个元素 D .p指向一个包含 5个元素的整型数组 E. p是一个整型数组 答案:B D
22
7)指针数组 当数组的元素类型为指针时,叫做指针数组。 【例 7.21】 下列程序的运行结果是( )。 [读程序写结果,重庆市 2004年第 2 次等级考试]
23
8)指针做函数参数 指针做函数参数的主要目的是利用在函数中, 利用指针去操作主调函数中的变量。 【例 7.22】 下列程序在数组中同时查找最大 值下标和最小值下标,并分别存放在 main函数的 变量 max和 min中,请填空。[读程序写结果,重 庆市 2003年第 2次等级考试]
10
【例 7.3】 由于指针的数据类型实际上是指定 指针所能指向对象的数据类型,所以不同数据类型 的指针变量不能相互赋值。( )[判断题,重庆市 2005年第 2次等级考试] 答案:对 分析:在某些特定情况下,可以在不同数据类 型指针之间通过强制类型转换赋值。
11
【例 7.4】 若有定义:long intj,﹡p;,则操 作 j=(long int)p;是合法操作。( )[判断题, 重庆市 2004年第 1次等级考试] 答案:对 【例 7.5】 在 C 语言中,程序
《C语言程序设计教程(第二版)》 第09章-指针(1)

访问p_int所 指向的变量
getch();
}
程序运行结果: num_int=12, *p_int=12 num_f=3.14, *p_f=3.14 num_ch=p, *p_ch=p
2019/2/22
11
1、指针变量的定义
指针变量的定义标识符
数据类型 *指针变量[,*指针变量2……];
例如, [案例9.1]中的语句:
int num_int=12, *p_int ;
特别说明:定义而未初始化的指针变量(例如 p_int)是悬空的。
使用悬空指针变量,很容易破坏系统,导致系统 瘫痪。
2019/2/22
12
2、取地址运算 : &变量名 例 如 , [ 案 例 9.1] 中 的 &num_int 、 &num_f 、 &num_ch 的结果,分别为对应变量的地址 (num_int 、 num_f、num_ch)。 注意:指针变量只能存放相同数据类型变量的 地址。 例如, [案例9.1]中的指针变量p_int、p_f、p_ch, 只能接收int型、float型、char型变量的地址,否则出 错。
使p_int指向变量num_int
2019/2/22
10
printf(“num_int=%d, *p_int=%d\n”, num_int, *p_int); printf(“num_f=%4.2f, *p_f=%4.2f\n”, num_f, *p_f); printf(“num_ch=%c, *p_ch=%c\n”, num_ch, *p_ch);
9.3* 1维数组的指针与列指针变量 9.4 字符串的指针和指向字符串的指针变量 9.5 指针数组与主函数main()的参数 9.6 返回指针值的函数
电大C语言程序设计 第5章 指针

计算机科学与技术专业本科
第5章 指针
(一) 教学内容 1. 指针的有关概念; 2. 指针的各种运算 3. 数组元素的指针访问方式 4. 数据存储空间的动态存储分配
第5章 指针
(二) 教学要求 了解:指针的有关概念; 理解:指针的各种运算符的含义,一维和二维 元素的指针访问方式,动态存储分配与释放函 数的含义; 应用:会分析含有指针操作的程序。
第5章 指针 5.3 指针运算 3. 间接访问(*) 操作符*可取指针变量所指单元内容,称为间接引用指针。 *(取内容)和&(取地址)为互逆操作。 #include<stdio.h> void main() { int x=10,y=20; int * xp=&x,*yp=&y; int z=*xp+*yp; printf("%d%d\n",*xp,*yp); *xp+=5; printf("%d%d%d\n",*xp,*yp,z); }
第5章 指针 5.2 指针变量 3. 几点说明 (6)在定义指针变量时,可以用const修饰。 指向常量的指针:在指针定义语句的类型前加const, 表指针指向的数据为常量。 结论:const int * pi=&a;(或int const * pi=&a;)中,*pi 为常量,pi为变量,故*pi不能为左值。
第5章 指针 5.2 指针变量 3. 几点说明 (6)在定义指针变量时,可以用const修饰。 例如: const int a=78; const int b=28; int c=18; const int * pi=&a; //int const * pi=&a; *pi=58; //错误,*pi为常量 pi=&b; *pi=68; //错误,*pi为常量 pi=&c; *pi=88; //错误,*pi为常量 c=98;
C语言——指针

4. 结论: 若要使变量的值通过函数调用而发生改变, 则形参必须是指针型,实参为地址量(&<变量名>)
或指针型。
另:全局变量和数组名作为参数也可改变变量的值.
总 结
若要使n个变量的值通过函数调用而发生改变,则
在主调函数中设n个变量,用n个指针变量指向它们。 将这些指针变量作为实参,将其地址传递给被调函
p1 p &a p2 &b p1 &b p2 &a
a 5
b 9
a 5 b 9
}
5,9 9,5
三、指针变量作为函数参数 前面讲过:数值型变量作为函数实参 形参数据值的改变不会影响实参。 但当用地址(指针变量)作参数时,作用为传址, 与数组名类似。 要求:形参、实参均为地址量。
单向 传递
形参,于是,
例:实现10.2 swap(int *p1, int *p2) { int temp; temp=p1; p1=p2;p2= temp; } #include <stdio.h> void main( ) { int a, b;
它代表的是地址+1个单位
重要概念: 指针变量也有各种类型(如上面所示),但指针变 量的值只能是整型值。
二、指针变量的引用方式 *指针变量名----表示所指变量的值。 指针变量名----表示所指向变量的指针(地址)。
两个运算符号:
&: 取地址运算符。 &i *: 指针运算符,取其指向的内容(所指变 量的值)。 *p
9,0,10
10,9,0
§10.3 数组与指针
一个变量的地址为该变量的指针。当用一个变 量来存放地址(指针)时,该变量称为指针变量。
一个数组元素相当于一个简单变量。于是,亦 可用一个指针变量来指向数组元素。
《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语言程序设计--第八章

30
8.5 知识拓展
案例8-11 指针的高级应用 [案例任务] 阅读下列程序 ,分析运行结果,了解指 针的各种应用。
程序代码
31
8.5 知识拓展
相关知识:
1.有关指针的数据类型小结 2.案例说明 3.main函数的参数
32
12
8.2 指针变量
[课堂训练8-1] void swap(int *p1,int *p2) { int *t; t=p1; p1=p2; p2=t; }
1.分析下面的程序,写出运行结果。 #include <stdio.h> void main() { void swap(int *p1,int *p2); int *p1,*p2,a=6,b=8; p1=&a; p2=&b; printf(" 交换前:*p1=%d,*p2=%d\n",*p1,*p2); swap(p1,p2); printf(" 交换后:*p1=%d,*p2=%d\n",*p1,*p2); }
17
8.3 指针与数组
案例8-6 [案例任务]
冒泡排序
使用指针指向一维整型数组,使用冒泡排 序法对数组元素从小到大排序并输出。
程序代码
18
8.3 指针与数组
相关知识: 1.冒泡排序法 2.指针变量的其他运算
19
8.3 指针与数组
案例8-7 [案例任务]
逆置一维数组
使用数组名或指针变量作为函数形参与实 参,完成一维数组元素的逆置。请分析程 序运行结果,并对两个方法进行比较。
6
8.2 指针变量
案例8-2 用指针交换两整数 案例8-3 用指针比较两数大小 案例8-4 用指针参数交换两整数
C语言--指针

值传递
运行结果:5, 9
27
例 将数从大到小输出 swap(int *p1, int *p2) { int p; p=*p1; *p1=*p2; *p2=p; } main() COPY { int a,b; int *pointer_1,*pointer_2; scanf("%d,%d",&a,&b); pointer_1=&a; pointer_2=&b; if(a<b)swap(pointer_1,pointer_2); printf("\n%d,%d\n",a,b); }
19
初始:
a p
?
3 :
0x2000
?
执行:*p=a
a
3 : 3
0x2000
p
?
?
20
初始:
a p
?
3 :
0x2000
?
执行:p=&a
a
3 :
0x2000
p
0X2000
21
指针变量作为函数参数
当指针变量作为函数参数时,传递的是变量的地址。读 以下程序: void testpoint(int *p) { int t; t=*p; t++; } void main() { int a=3,* p; p=&a; printf(“a=%d\n”,a); testpoint(p); printf(“a=%d\n”,a); }
22
t
3 :
0x6000
p
&amp;a
指针算术运算
使用递增/递减运算符(++ 和 --)将指针递增或 内存 递减
《C语言程序设计》实验报告实验六

《C语言程序设计》实验报告实验六使用指针的程序设计学号姓名一、实验目的1、掌握指针的概念,会定义和使用指针变量;2、能正确使用数组的指针和指向数组的指针变量;3、熟悉指针作为函数参数的定义和调用方法;4、能正确使用字符串的指针和指向字符串的指针变量。
二、实验内容1.分析下面的程序并上机运行程序,要求写出3组以上程序的运行结果。
#include <stdio.h>void main(){int *p1,*p2,*p;int a,b;printf("Input a b please");scanf("%d%d",&a,&b);p1=&a;p2=&b;if(a>b){ p=p1;p1=p2;p2=p;}printf("*p1=%d, *p2=%d\n",*p1,*p2);printf("a=%d, b=%d\n",a,b);}『运行结果:』输入1,2得:*p1=1,*p2=2a=1,b=2输入2,1得:*p1=1,*p2=2a=2,b=1输入56,123得:*p1=56,*p2=123a=56,b=1232.下列程序的功能是分别求出数组中所有奇数之和以及所有偶数之和。
形参n给了数组中数据的个数,利用指针odd返回奇数之和,利用指针even 返回偶数之和。
请在下面空白处将实现这一功能的函数完善,并且调试运行出结果。
#include <stdio.h>#define N 10void fun(int *a,int n,int *odd,int *even){int m;*odd=0; *even=0;for(m=0;m<n;m++)if(*(a+m)%2==0)*even+=*(a+m);else*odd+=*(a+m);}void main(){int a[N]={1,10,2,3,19,6},i,n=6,odd,even;printf("The original data is:\n");for(i=0;i<n;i++)printf("%5d",*(a+i));printf("\n\n");fun(a,n,&odd,&even);printf("The sum of odd numbers:%d\n",odd);printf("The sum of even number:%d\n",even);}『运行结果:』3.编程实现从键盘输入一个字符ch和一个字符串str,利用字符指针实现删除字符串str中和字符ch相等所有字符,然后输出字符串str。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
c语言程序设计--指针
一、地址
1.内存是计算机进行数据运算的物理空间,地址即内存中的指定位置。
2.操作符“&”作用于变量,找到地址。
操作符“*”作用于地址,取得该地址内存中存储的变量。
二、地址应用
1.变量地址做函数参数
void fun1(int *a)
{
函数体;
}
int main()
{
int a=5;
fun1(&a);
return 0;
}
2.数组做函数参数
void fun1(int a[])
{
函数体;
}
int main()
{
int a[5]={5,4,3,21,7};
fun1(a);
return 0;
}
三、指针
1.指针是存放变量地址的变量
2.声明格式:类型说明符*标识符;
3.指针可以指向变量、常量、数组、字符串、结构体、函数。
4.指针需要初始化
例:int *a;
int num=5;
a=#
5.指针指向同一变量时可以进行比较运算,例如当两个指针指向同一数组时,比较运算表示比较两个指针在数组中位置的大小。
两个指针相等表示他们指向数组中的同一个元素。
6.指针和整数进行加减运算,编译器会根据所指对象的数据长度对该整数进行放大,char的放大因子为1,int和short的放大因子为2,long和float的放大因子为4,double的放大因子为8。
7.当两个指针指向同一变量时,他们可以进行减运算。
例如,当两个
指针指向同一个数组时,他们的差是两个指针之间元素的个数。
相减的结果遵守对象类型的字节长度的缩减规则。
8.指向数组的指针
数组在内存空间中的存储是连续的,数组名表示数组的第一个元素的地址。