第8章 指针

合集下载

《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语言程序设计知识点—第8章 指针结构体与预处理命令

C语言程序设计知识点—第8章 指针结构体与预处理命令
比较两个指针 #include<stdio.h> void main () { int *ptrnum1, *ptrnum2; int value = 1; ptrnum1 = &value; value += 10; ptrnum2 = &value; if (ptrnum1 == ptrnum2) printf("\n 两个指针指向同一个地址\n"); else printf("\n 两个指针指向不同的地址\n"); }
指针使用示例 2 void main() { int num1 = 50, num2 = 100; int *ptr1, *ptr2; ptr1 = &num1; printf(" num1 的值是: %d", *ptr1); printf("\n num1 的地址是: %x \n", ptr1); ptr2 = &num2; printf("\n num2 的值是: %d", *ptr2); printf("\n num2 的地址是: %x \n", ptr2); *ptr2 = *ptr1; printf("\n 重新赋值后 num2 的值是: %d", *ptr2); printf("\n 重新赋值后 num2 的地址是: %x\n", ptr2); }
C 语言程序设计知识点
主讲教师:杨剑
第 8 章:指针、结构体与预处理命令
1. 本章目标
理解指针的概念 定义指针变量 掌握对指针的操作 理解指针和数组的关系 理解结构体的概念和定义 理解预处理指令
2. 内存地址
内存是一个连续编址的空间,每一个存储单元都有一个固定的编号,称为内存地址。 内存地址通常用 16 进制数表示。

C二级 第8章 指针

C二级 第8章 指针

1.以下定义语句中正确的是A) int a=b=0; B) char A=65+1,b='b';C) float a=1,*b=&a,*c=&b; D) double a=0.0; b=1.1;参考答案:B【解析】A选项语句中b变量还没有定义不能直接用于给a变量赋值。C选项语句中*b、*c表示的是一个实型变量的地址,不能再将&b赋值给指针型变量c。D选项语句中a=0.0后面应该为逗号,不能是分号。2.有以下程序#include <stdio.h>void f(int *p,int *q);main(){ int m=1,n=2,*r=&m;f(r, &n);printf("%d,%d",m,n);}void f(int *p,int *q){ p=p+1;*q=*q+1;}程序运行后的输出结果是A) 2,3 B) 1,3 C) 1,4 D) 1,2参考答案:B【解析】在f(int *p,int*q)函数中,执行p=p+1是将p所对应的地址加1,而*q=*q+1是将q所指向的n的地址所对应的值加1,所以m的得知所对应的值没有变,而n的值则为3了。

因此B选项正确。

3.以下叙述中正确的是A) 如果p是指针变量,则&p是不合法的表达式B) 如果p是指针变量,则*p表示变量p的地址值C) 在对指针进行加、减算术运算时,数字1表示1个存储单元的长度D) 如果p是指针变量,则*p+1和*(p+1)的效果是一样的参考答案:C【解析】B选项中,如果p是指针变量,则*p表示变量p所指向的地址的值;A选项中,如果p是指针变量,则&p表示变量p的地址;D选项中,如果p是指针变量,*p+1表示将p所指的值加上1,而*(p+1)表示的是先将指针右移一位再取所指向变量的值。

因此C选项正确。

4.以下叙述中正确的是A) 基类型不同的指针变量可以相互混用B) 函数的类型不能是指针类型C) 函数的形参类型不能是指针类型D) 设有指针变量为double *p,则p+1 将指针p移动8个字节参考答案:D【解析】B选项中,所谓函数类型是指函数返回值的类型。

C语言程序设计教程(电子教案)

C语言程序设计教程(电子教案)
实用文档
学习目标
对C语言有一个概括的了解, 能够编写包含键盘输入、计算和 显示输出等操作的简单C程序。
4
主要内容
• C语言的产生与特点 • 简单C程序的组成 • C语言应用程序开发的基本步骤
5
1.1 C语言的产生及特点
C语言是为了编写系统程序而在1968年开始 研发的计算机高级语言
C语言表达能力强,使用灵活,程序结构清 晰,紧凑,可移植性好
指针 类型
17
基本数据类型说明符
整型:int long
字符型:char 实型:float
double long double
18
2.2 常 量
常量∶在程序运行过程中,其值不能被改 变的量。
一. 不同数制整型常量的表示
例如: 12 :十进制数 12
012 :八进制数 12(等于十进 制数10,用前导符0表示八进制数常量)
计算x+y+z,并将结 8果赋给变量sum
显示变量 sum的值
主函数 main()
一般C程序的组成
【例1-2】采用模块结构,改写例1-1的程序。 add(int x,int y,int z )
{ return(x+y+z);
}
函数add()
调用函数 add()
main() { int x,y,z; printf("Please Input Three Integers:\n "); scanf("%d,%d,%d ",&x,&y,&z);
4. 用‘\’ ’表示字符’ ,‘\”’表示字符”, ‘\\ ’表示字符\ 。
5. 用双引号括起来的字符序列表示字符串常量,其 中最后一个字符是字符串结束符‘\0’,不显式 地表示出来。如:“English” 。

(教参)第8章实验十一: 练习使用多用电表含解析

(教参)第8章实验十一: 练习使用多用电表含解析

实验十一:练习使用多用电表,◎注意事项1.多用电表使用注意事项(1)使用前要机械调零。

(2)两表笔在使用时,电流总是“红入”“黑出”。

(3)测电阻时①指针指中值附近较准,否则换挡。

②每换一挡必须重新欧姆调零。

③读出示数要乘以倍率。

(4)使用完毕,选择开关置于“OFF”挡或交流电压最高挡,长期不用应取出电池。

2.电路故障检测注意事项将多用电表拨到直流电压挡作为电压表使用。

在电源完好时,将电压表与外电路的各部分电路并联。

若电压表示数等于电源电动势,则说明该部分电路中有断点。

◎误差分析1.偶然误差(1)估读时易带来误差。

(2)表头指针偏转过大或过小都会使误差增大。

2.系统误差(1)电池用旧后,电动势会减小,内阻会变大,致使电阻测量值偏大,要及时更换电池。

(2)测电流、电压时,由于电表内阻的影响,测得的电流、电压值均小于真实值。

考点一多用电表的原理、读数及使用欧姆表刻度盘的特点1.左∞右0:电阻无限大刻度线与电流、电压挡零刻度线重合,电阻零刻度线与电流、电压挡最大刻度线重合。

2.刻度不均匀:左密右疏。

3.欧姆挡是倍率挡:即读出的示数应再乘以该挡的倍率;电流、电压挡是量程范围挡,在不知道待测电阻的估计值时,应先从小倍率开始,熟记“小倍率小角度偏,大倍率大角度偏”。

(1)用多用电表的欧姆挡测量阻值为几十千欧的电阻R x,以下给出最可能的实验操作步骤,其中①为选择开关,②为欧姆调零旋钮.把你认为正确的步骤前的字母按合理的顺序填写在横线上:________。

a.将两表笔短接,调节②使指针对准刻度盘上欧姆挡的0刻度,断开两表笔b.将两表笔分别连接到被测电阻的两端,读出R x的阻值后,断开两表笔c.旋转①使其尖端对准欧姆挡“×1 k”d.旋转①使其尖端对准欧姆挡“×100”e.旋转①使其尖端对准交流500 V挡,并拔出两表笔根据如图所示指针位置,此时被测电阻的阻值约为________Ω。

(2)下列关于用多用电表欧姆挡测电阻的说法中正确的是________(填选项前的字母)。

高树芳C语言程序设计--第八章

高树芳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语言第8章练习题--指针

c语言第8章练习题--指针

1、int *p 的含义是(B)A.p是一个指针, 用来存放一个整型数B.p是一个指针, 用来存放一个整型数据在内存中的地址C.p是一个整型变量D. 以上都不对2、以下函数用来求出两整数之和,并通过形参将结果传回,请填空。

void func(int x,int y, ___int*____ z){ *z=x+y; }3、有如下程序段(B)int *p,a=10,b=1;p=&a; a=*p + b;执行该程序段后,a的值是A. 12B. 11C. 10D. 编译出错4、若己定义:int a[9],*p=a;并在以后的语句中未改变p的值,不能表示a[1]地址的表达式是( C)A) p+1B) a+1C) a++D) ++p5、以下程序运行后的输出结果是(A)void main( ){ int a[ ]={1,2,3,4,5,6,7,8,9,0},*p;for(p=a;p<a+10;p++) printf("%d,",*p);}A)1,2,3,4,5,6,7,8,9,0,B)2,3,4,5,6,7,8,9,10,1,C)0,1,2,3,4,5,6,7,8,9,D)1,1,1,1,1,1,1,1,1,1,6、下面程序的输出是(D)void prtv(int *x)printf("%d\n", ++*x);}main(){ int a=25;prtv(&a);}A) 23 B) 24 C) 25D) 267、有以下函数(B)char fun(char *p){ return p; }该函数的返回值是A) 无确切的值B) 形参p中存放的地址值C) 一个临时存储单元的地址D) 形参p自身的地址值8、下列程序的输出结果是(7)#include<stdio.h>void fun (int *p1, int *p2){ if (*p1>*p2) printf ("%d\n",*p1);else printf ("%d\n",*p2);}void main ( ){ int a=3,b=7;fun (&a, &b);}9、下列程序的运行结果是(B)void fun(int *a, int *b){ int *k;k=a; a=b; b=k;}main(){ int a=3, b=6, *x=&a, *y=&b;fun(x,y);printf("%d %d", a, b);}A) 6 3 B) 3 6 C) 编译出错D) 0 010、以下程序调用findmax函数返回数组中的最大值(B)findmax(int *a,int n){ int *p,*s;for(p=a,s=a; p-a<n; p++)if ( ) s=p;return(*s);}main(){ int x[5]={12,21,13,6,18};printf("%d\n",findmax(x,5));}在下划线处应填入的是(B)A) p>s B) *p>*s C) a[p]>a[s] D) p-a>p-s11、下列程序段的输出结果是(A)void fun(int *x, int *y){ printf("%d %d", *x, *y); *x=3; *y=4;}main(){ int x=1,y=2;fun(&y,&x);printf("%d %d",x, y);}A) 2 1 4 3 B) 2 1 3 4 C) 1 2 1 2 D) 2 1 1 212、以下程序执行后输出的结果是___84________。

第8章 指针

第8章 指针

已说明过,且变量类型应与指针类型一致。
可以用一个已赋初值的指针去初始化另一 个指针变量。 不要用一个局部变量去初始化 static 型指针。
4、间接引用指针
与指针有关的两个运算符 & 取地址运算符 * 实例: 指针运算符(或称“间接引用”运算符)
void main(){
int a=10; int *pointer_1; pointer_1 = &a; cout<< * pointer_1;

8.1 指针概念
8章
指针
8.5 const指针
8.6 指针与函数
8.2 指针运算
8.3 指针与数组
8.7 字符指针
8.4 堆内存分配
8.9 命令行参数
本章介绍C++的指针。C++语言拥有在运行时获得变量的地址和操作地址 的能力,这种用来操纵地址的特殊类型变量就是指针,指针对于成功地进 行c++语言程序设计是至关重要的。学习本章后要求能够使用指针,能够用 指针给函数传递参数,理解指针、数组和字符串之间的紧密联系,能够声 明和使用字符串数组,正确理解命令行参数。
值。 实例:ch8_9.txt
【 8.5 const指针】
指向常量的指针(常量指针):
在指针定义语句前加上const,表示指向的对象是常量。 不能通过指针来改变所指对象的值,但指针本身可以改 变,可以指向另外的对象。 例: const int a=78;
const int b=28; int c=18; const int *pi=&a; *pi=58; pi=&b; *pi=68; pi=&c; *pi=88; c=98;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第8章指针
1. 单项选择题
(1)指针 pstr所指字符串的长度为D。

char *pstr="\t\"1234\\abcd\n"
A.15
B.14
C.13
D.12
(2)若有定义int a[4][6];则能正确表示a数组中任一元素a[i][j](i,j 均在有效范围内)地址的表达式A。

A.&a[0][0]+6*i+j
B.&a[0][0]+4*j+i
C.&a[0][0]+4*i+j
D.&a[0][0]+6*j+i
(3)以下程序段的输出结果为D。

char astr[5]="1234";
char *pstr=astr;
printf("%c",pstr[1]-'0');
A.1
B. 2
C. ASCII码值为 1 的字符
D. ASCII 码值为 2 的字符
(4)下述程序段的输出结果为D。

char astr[]="abcde";
char *pstr=&astr[5];
while(--pstr>=astr)
putchar(*pstr);
putchar('\n');
A. abc
B. cba
C. abcde
D. edcba
(5)若有定义 int a=1,*b,c;,以下不正确的是 A 。

A. b=a
B. b=&a
C. b=&a,c=*b
D. c=a
(6)以下程序段的运行结果为 C 。

intnum[]={1,2,3,4,5,6,7,8,9},*pnum=&num[2];
pnum++;
++pnum;
printf("%d\n",*pnum);
A. 3
B. 4
C. 5
D. 6
(7)以下程序段的运行结果为 B 。

char *pstr="My name is Tom";
int n=0;
while(*pstr++!='\0')
n++;
printf("n=%d\n",n);
A. 12
B. 14
C. 16
D. 不确定
(8)以下程序段的运行结果为 B 。

int num[9]={1,2,3,4,5,6,7,8,9},*p;
p=num;
*(p+1)=0;
printf("%d,%d,%d\n",*p,p[1],(*p)++);
A. 2,0,1
B. 1,0,1
C. 2,2,2
D. 1,1,1
(9)以下程序段的运行结果为 C 。

int a=5,*p=&a,b,*q;
a=10;
*p=15;
q=p;
*q=20;
b=*q;
p=&b;
printf("a=%d,b=%d,*p=%d,*q=%d\n",a,b,*p,*q);
A. a=5,b=10,*p=15,*q=20
B. a=20,b=15,*p=10,*q=5
C. a=20,b=20,*p=20,*q=20
D. a=15,b=15,*p=15,*q=15
(10)下面程序的运行结果是 B 。

intmain ( )
{
int x[5]={2,4,6,8,10}, *p, **pp ;
p=x , pp = &p ;
printf(“%d”,*(p++));
printf(“%3d”,**pp);
return 0;
}
A)4 4 B)2 4 C)2 2 D)4 6
(11)若有定义int x[4][3]={1,2,3,4,5,6,7,8,9,10,11,12};
int (*p)[3]=x ; 则能够正确表示数组元素x[1][2]的表达式是 D 。

A.*((*p+1)[2]) B. (*p+1)+2
C.*(*(p+5)) D. *(*(p+1)+2)
(12)若有说明:
char *language[]={“FORTRAN”,”BASIC”,”PASCAL”,”JAVA”,”C”};则language[2]的值是 B 。

A. 一个字符
B. 一个地址
C. 一个字符串
D. 一个不定值
(13)设有定义:char *cc[2]={“1234”,”5678”};则正确的叙述是 A 。

A. cc数组的两个元素中各自存放了字符串”1234”和”5678”的首地址
B. cc数组的两个元素分别存放的是含有4个字符的一维字符数组的首地址
C. cc是指针变量,它指向含有两个数组元素的字符型一维数组
D. cc数组元素的值分别维”1234”和”5678”
2. 编程题(要求用指针实现)
(1)编写一个函数,实现从键盘上输入 3 个整数,按从大到小的顺序输出。

voidsort(int *x,int *y,int *z)
{
int t;
if(*x<*y)
{t=*x;*x=*y;*y=t;}
if(*x<*z)
{t=*x;*x=*z;*z=t;}
if(*y<*z)
{t=*y;*y=*z;*z=t;}
}
(2)编写一个函数,实现输入一串字符,统计它的字符总数和其中大写字母的个数(不用字符串函数)。

void count(int *n,int *c1,int *c2)
{
inti=0,j=0,k=0,c;
c=getchar();
while(c!='\n')
{
i++;
if(c>='a'&&c<='z') j++;
if(c>='A'&&c<='Z') k++;
c=getchar();
}
*n=i;*c1=j;*c2=k;
}
int main()
{
inta,b,c;
count(&a,&b,&c);
printf("%d,%d,%d\n",a,b,c);
return 0;
}。

相关文档
最新文档