指针1

指针1
指针1

指针

一、指针概述

1. 地址

C++程序中每一个实体,如变量、数组和函数等,都要在内存中占有一个可标识的存储区域。每一个存储区域由若干个字节组成,在内存中,每一个字节都有一个“地址”,一个存储区的“地址”指的是该存储区中第一个字节的地址。

2.指针

指针就是存储区域的地址。一个地址指向一个程序实体的存储空间。

直接访问:通过变量名或地址访问程序中一个实体的存储空间的方式(其实通过变量名访问也就是通过地址访问)。

间接访问:把一个变量的地址放在另一个变量中。

3.指针变量

专门用来存放地址的变量就叫指针变量,需要专门加以定义。

二、指针的类型与指针的定义

指针也是具有类型的。指针的类型就是它所指向的变量的类型。例如,一个指向int型的指针,一个指向一维数组的指针。

在使用一个指针变量之前,先要用声明语句对其进行定义。例如:int *p;

定义了一个指向整型数据的指针变量p。即p是一个存放整型变量地址的变量。

应当特别注意的是,定义一个指针变量必须用符号“*”,它表示其后的变量为指针变量,指针变量为p,而不是*p。

要想使一个指针变量指向一个变量,必须将变量的地址赋给指针变量。例如:

int *p, i=3;

p=&i;

指针变量也可以定义为指向实型、字符型以及其它类型的变量。如:

float *p ;

char *q ;

三、指针运算符

在C++语言中,有两个有关指针的运算符:

&:为取地址运算符,&x的值为x的地址。

* :指针运算符,或称指向运算符,也称间接运算符,*p代表p 所指向的变量。如:

int a=15, *p;

p=&a;

cout<

cout<<*p <

*p=10; 将10赋给p所指向的变量。

Cout <

注意:此处的*p与定义指针变量时用的*p含义是不同的。在定义时,“int *p”中的“*”不是运算符,它只是表示其后面的变量是一个指针类型的变量。而在程序中的执行语句中引用的“*p”,其中的“*”是一个指针运算符,*p表示“p指向的变量”。

因此,int i , *p ;

p=&i ;

则:*p和i 相同。

例: 交换两个指针变量所指向的变量的值。

Void main()

{ int *p1 , *p2 , i , i1=10 , i2=20;

p1=&i1,p2=&i2;

i=*p1;*p1=*p2;*p2=i;

cout<

}

运行结果为:

20 10

四、指针与数组

1.一维数组的指针表示方法

一维数组名代表数组的起始地址。假设一个数组int a[5],其起始地址为1010,则:

a的值就为1010,a[0]的地址也为1010,

a[1]的地址为1014,也可以用a+1表示,也就是说,“a+1指向数组a中下标为1的元素”。

同样,a+i是a[i]的地址。需要说明的是:在编译系统计算实际地址时,a+i中的i要乘上数组元素所占的字节数,即:a+i×(一个元素所占的字节数)。

例如:a+1的实际地址为:1010+1×4=1014 ;

a+3的实际地址为:1010+3×4=1022 ;余类推。

或者说,a+i和&a[i]是相等的,都是a[i]的地址。

请注意区分a[i]与&a[i]二者的不同含义。

为了引用数组中的一个元素,可以用下面三种不同的方法:

(一)下标法:如a[3]

(二)地址法:通过地址a+3可以找到a[3]元素,*(a+3)就是a[3]。

因此下面二者等价:

a[i]——下标法

*(a+i) ——地址法

都是指a数组中序号为i的元素值。

(三)定义一个指针变量,指向一数组元素。

例如:定义一个指针变量p,使它的值等于某一元素的地址,这样*p就是该元素的值。

int *p , i=10;

p=&i ;

例:分别用下标法、地址法和指针法访问数组元素。

Void main()

{

int a[5]={1,3,5,7,9}, *p , i ;

for(i=0 ; i<5 ; i++)

cout<

cout<

for(i=0 ; i<5 ; i++)

cout<<*(a+i)<<””; /* 用地址法*(a+i)输出*/

cout<

for(p=a;p

cout<<*p<<””; /* 用指针变量*p输出*/

cout<

}

运行结果为:

1 3 5 7 9

1 3 5 7 9

1 3 5 7 9

现在着重分析第三种方法:用指针变量p指向数组元素的方法。

p的初值等于a,此时p指向a数组中第一个元素a[0],*p就是a[0]。

在输出*p的值后,p++使p指向下一个元素a[1],*p就是a[1],在输出*p的值后,p++又使p指向下一个元素,……,直到p=a+5为止。

由于p是变量,p的值不断在变化,而p的值是地址,因此p不断改变其指向。

五、指针与字符串

字符串存放在字符数组中。因此,对字符串操作可以定义一个字符数组,也可以定义一个字符指针。

例:用字符指针指向一个字符串。

Void main()

{

char string[ ]=“ C Language”;

char *p;

p=string;

cout<

cout<

}

运行结果:

C Language

C Language

也可以不定义字符数组,而直接用一个指针变量指向一个字符串常量。如:

void main()

{

char *p=”C Language”;

cout<

}

程序中虽然没有定义数组,但字符串在内存中是以数组形式存放的。它有一个起始地址,占一片连续的存储单元,并以“\0”结束。char *p=”C Language”;的作用是:使指针变量P指向字符串的起始地址。

六、指针数组

一个数组,如果每个元素的类型都是整型的,那么这个数组称为整型数组;如果每个元素都是同类型的指针类型,则它是指针数组。也就是说,指针数组是用来存放一批地址的。

前已述及,在初始化字符数组时,可以用指针变量来代替字符数组。例如:

char *string=“I am a student”;

如果有五个字符串,可以用五个指针变量来指向它,这就是指针数组。例如:

char *name[5]={“LiFang”, “ZhangLi”, “LingMaoTi”, “SunFei”,“Wangfang”}

name是一维数组,它有五个元素,每个元素都是指向字符数据的指针型数据。其中,name[0]指向第一个字符串“LiFang”。

七、指针与函数

指针与函数的关系,主要表现在如下三个方面:

1.用指针作为函数参数

2.函数的返回值是指针

3.指向函数的指针

1.指针作为函数参数

例:有一数组,有10个元素,要求输出其中最大和最小的元素。

#define N 10

void main()

{

void max_min(int arr[ ],int *pt1,int *pt2,int n);

int array[N]={1,8,10,2,-5,0,7,15,4,-5};

int *p1,*p2,a,b;

p1=&a;p2=&b;

max_min(array , p1 , p2 , N);

printf(“max=%d,min=%d\n”,a,b);

}

void max_min(int arr[ ],int *pt1,int *pt2,int n)

{

int i;

*pt1=*pt2=arr[0];

for(i=0;i

{

if(arr[i]>*pt1) *pt1=arr[i];

if(arr[i]<*pt2) *pt2=arr[i];

}

}

2.指向函数的指针

一个函数包括一系列的指令,在内存中占据一片存储单元,它有一个起始地址,即函数的入口地址,通过这个地址,可以找到该函数,这个地址就称为函数的指针。我们可以定义一个指针变量,使它的值等于函数的入口地址,那么通过这个指针变量,也能调用该函数,这个指针变量称为指向函数的指针变量。

定义一个指向函数的指针变量的一般形式:

类型标识符(*指针变量名)( );

例如int (*p)( );

它表示p指向一个返回值为整型的函数。注意,*p两边的括弧不

能省略。如果写成int *p( );就称了返回指针值的函数。

在定义了指向函数的指针变量后,可以将一个函数的入口地址赋给它,这就实现了使指针变量指向一个指定的函数。

如:p=fun1;

可以用下列形式调用函数:

(*指针变量)(实参列表);

例如: (*p)(a,b);其相当于fun1(a,b);也可以写成p(a,b);

例6.26 写一个程序,给出一个一维数组的元素值,先后四次调用一个函数,分别求①数组中元素之和②最大值③下标为奇数的元素之和④求各元素的平均值。

#define N 12

main()

{

static float a[12]={1.5,3.8,5.6,7.8,91.6,1.61,13.3,

15.0,17.5,19.9,21.7,23.0};

float arr_add( ),odd_add( ),arr_ave( ),arr_max( );

void process(float *p,int n,float (*fun)( ));

int n=N;

printf("the sum of %d elements is:",n);

process(a,n,arr_add);

printf("the sum of odd elements is:");

process(a,n,odd_add);

printf("the average of %d elements is:",n);

process(a,n,arr_ave);

printf("the maximum of %d elements is:",n);

process(a,n,arr_max);

}

void process(float *p,int n,float (*fun)( ))

{

float result;

result=(*fun)(p,n);

printf("%8.2f\n",result);

}

float arr_add(float arr[],int n) {

int i;

float sum=0;

for(i=0;i

sum=sum+arr[i];

return(sum);

}

float odd_add(float *p,int n) {

int i;

float sum=0;

for(i=0;i

sum=sum+*p;

return(sum);

}

float arr_ave(float *p,int n) {

int i;

float sum=0,ave;

for(i=0;i

sum=sum+p[i];

ave=sum/n;

return(ave);

}

float arr_max(float arr[],int n) {

int i;

float max;

max=arr[0];

for(i=1;i

if (arr[i]>max) max=arr[i];

return(max);

}

4.返回指针的函数

一个函数在调用之后可以带回一个值返回到主调函数,这个值可以是整型、实型、字符型等,也可以是一个指针类型。定义这种函数的例子如:

int *fun(a,b);

例:编写一个函数,它的作用是在一个字符串中找一个指定的字符,并返回该字符的地址

char *strchr(char *str,char ch)

{

while(*str++!='\0')

if(*str==ch)

return str;

return (0);

}

main()

{

char *strchr(char *str,char ch);

char *pt,ch,line[]="I love China";

ch='C';

pt=strchr(line,ch);

printf("\nstring starts at address %o.\n",line);

printf("First occurrence of char %c is address

%o.\n",ch,pt);

printf("This is position %d(starting from 0)\n",pt-line);

}

八、指针的运算

指针是一种数据类型,应具有无符号整数的值。由于地址本身的特征,也给指针运算带来一些限制,它只能进行:

●与整数相加、减运算

●同一数组中各元素地址间的关系运算与相减运算

●赋值运算

其它的运算,如两个指针相加、相乘、相除、移位以及指针与实

数相加等都是不允许的。

(一)指针与整数相加、减

指针与整数相加、减,表示指针在内存空间上、下移动,移动以其类型的长度为单位。

(二)指向同一数组中元素的指针的关系运算与相减运算

指向同一数组中元素的指针的关系运算,是比较它们之间的地址大小。两个指针相等,表明它们指向同一数组元素。

两个指向同一数组中的元素的指针相减,是计算它们之间的元素数目。

(三)指针赋值

指针可以通过赋值运算改变其所指向的实体,有三种情形:

(1)给指针赋以一个对应类型的变量地址,如

float f1 , f2 ;

float *p=&f1;

(2)同一类型指针间的赋值,如

int a , b;

int *pa=&a , *pb=&b ;

pa=pb;

(3)指针增1、减1,即指针向上或向下移动一个所指向的数据类型空间。

C++程序设计 第八章 指针和引用

C++程序设计 第8章指针和引用 在程序运行时变量和函数都存放在内存中,通过变量名来访问数据、通过函数名来调用函数都是直接访问方式。还有另一种间接访问方式就是用指针。指针的本质是内存地址。指针往往用于说明函数的形参,使实参能通过指针传递,以提高函数调用的效率。利用指针能动态地使用内存,以提高内存使用效率。指针也能用来表示数据关联,以构成复杂的数据结构。指针是C程序中最常见的类型。引用是C++扩展的新概念,主要用于函数形参和返回类型。本章将详细介绍指针和引用的概念及应用。 8.1 指针及指针变量 指针(pointer)的本质是内存地址。指针变量就是专门存储地址的一种变量。通过指针变量所存储的地址来访问数据是一种间接寻址方式。由于处理器的机器语言能支持间接寻址,所以使用指针可以达到较高的计算性能。 8.1.1 地址的概念 C++编译器对不同对象或变量按其数据类型分配合适大小的存储空间。例如为char或bool型变量分配1个字节(bytes)的存储空间,short分配2字节,int和float分配4个字节,为double型变量分配8个字节的存储空间。当程序执行时,代码和变量都加载到内存中。计算机内存被分成若干个存储单元,存储单元以字节为单位。每个存储单元都有一个固定的编号,这个编号就是内存地址。尽管一个变量可能占用多个字节空间,但都通过第一个字节的地址来访问。存放某个变量的第一个字节的地址就是该数据的首地址。 指针即内存单元的地址,而数据是内存单元中的内容(或值)。 假设在程序中说明了1个int型的变量a,其值为68。系统为变量a分配4字节的存储空间,设首地址为0X0065FDF4。通过地址0X0065FDF4就能找到变量a在内存中的存储单元,从而对变量a进行访问。0X0065FDF4就是变量a的指针。知道一个变量的地址和变量的类型就能对变量进行访问,就如同知道房间号就能找到房间,从而找到房间里的主人。 指针是一种特殊的数据类型。所有类型的变量,无论是基本类型、用户定义类型、还是这些类型的数组,在一次运行时都有确定的地址,因此它们都有指针。对于32位计算机,地址长度就是32位,因此一个指针需要4个字节,与整型int、浮点型float具有相同大小的长度。一个指针不仅有值,而且还要确定其类型,表示它能指向什么类型的数据,决定了通过它要取用多少字节作为该变量的值。

2017年上半年数据结构(C++)第一次作业

2014年上半年数据结构(C++)第一次作业 一.单项选择题(20分) 1.已知一棵二叉树的前序遍历序列为ABCDEFG,则其中序遍历可能是____b____。 a、CABDEFG b、ABCDEFG c、DACEFBG d、ADCFEGB 2.设一个链表最常用的操作是在末尾插入结点和删除尾结点,则采用__b______存储方式最节 省时间(假设链表仅设有一个first指针一个)。 a. 单链表 b. 带头结点的双循环链表 c. 单循环链表 d. 双链表 3.有6个元素6,5,4,3,2,1顺序入栈,则所得到的输出序列不可能是___c____。 a. 5 4 3 6 1 2 b. 4 5 3 1 2 6 c. 3 4 6 5 2 1 d. 2 3 4 1 5 6 4.链表不具有的特点是__d___。 a.插入,删除不需要移动元素 b.所需空间与线性长度成正比 c.不必事先估计存储空间 d.可随机访问任一元素 5.若长度为n的线性表采用顺序存储结构,在其第i个位置插入一个新元素的算法的时间复杂 度为_____c____。(1≤i≤n+1) a、O(0) b、O(1) c、O(n) d、O(n2) 6.对于一个头指针为head的带头结点的单链表,该表为空表的条件是__a____为真值; a. head->next==NULL; b. head==NULL; c. head->next==head; d. head!=NULL; 7.用数组A[0..N-1]存放一个循环队列,一元素出队时,其队头指针front的修改方法是 ___a____: a. front = (front + 1) mod N; b. front = (front - 2)mod N; c. front = front + 1; d. front = front – 2; 8.若用Head()和Tail()分别表示取广义表的表头和表尾,广义表A=(1,2,(3,4),(5,(6,7))),则 Head(Tail(Head(Tail(Tail(A))))) b 。 a. 1 b. 4 c. () d. (4) 9.设关于串的叙述中,哪一个是不正确的?___b_____ a. 串是字符的有限序列 b. 空串是由空格构成的串 c. 模式匹配是串的一种重要运算 d. 串既可以采用顺序存储,也可以采用链式存储 10.链下列排序算法中时间复杂度不受数据初始状态影响,恒为O(n2)的是____c____。 a.堆排序 b.起泡排序 c.直接选择排序 d.快速排序 二.填空作图题(共56分): 1.设 n是偶数,且有程序段: for(i=1; i<=n; i++) { if(2*i <= n) { for(j = 2* i; j<=n;j++)

C语言指针实验报告

C语言程序设计实验报告 1实验目的 (1)掌握指针的概念,会定义和使用指针变量; (2)能正确使用变量的指针和指向变量的指针变量; (3)能正确使用数组的指针和指向数组的指针变量; (4)能正确使用字符串的指针和指向字符串的指针变量; 2实验内容 将一个任意整数插入到已排序的整形数组中,插入后,数组中的数仍然保持有序;要求: (1)整形数组直接由赋值的方式初始化,要插入的整数有scanf()函数数入;(2)算法实现过程采用指针进行处理; (3)输入原始数据以及插入整数后的数据,并加以说明;

3算法描述流程图

4源程序 #include main() { int a[100],m,i,*p,n,w; printf("请输入要输入的数组的元素个数:\n"); scanf("%d",&n); printf("请输入已排好序的数组:\n"); for(i=0;i=w;i--) { a[i+1]=a[i]; } a[i+1]=m; for(i=0;i<=n;i++) { printf("%-4d",a[i]); } printf("\n"); } 5测试数据 “1,3,5,7,9,11,13,15,17,19······10” 6运行结果 7出现问题及解决方法 在编写过程中,

for(i=n-1;a[i]>=w;i--) { a[i+1]=a[i]; } a[i+1]=m; 这一步没有注意a[i++]=m和a[i+1]=m中i++和i+1不同,a[i++]=m是先将的值赋给a[i],然后在执行自增;而在实验过程中忽略了这一点,造成了不必要的麻烦; 8实验心得 通过这次指针实验掌握了指针的概念,会定义和使用指针变量,并且能利用指针来简单化一些问题,给以后的编程带来了很大的便利;

第十二讲 汇编程序的基本结构

第十二讲汇编程序的基本结构 教学目的: 1、掌握汇编语言的三种结构 2、掌握顺序结构、分支结构程序的编写方法 教学重点、难点: 分支结构、分支条件的确定 循环程序的结构构思 主要教学内容(提纲): 一、顺序程序设计 二、分支程序 三、循环程序 四、子程序 讲授要点 §4-2 汇编语言程序的基本结构及应用举例 程序编写做到: 占用存储空间少; 运行时间短; 程序的编制、调试及排错所需时间短; 结构清晰,易读、易于移植。 按结构化程序设计思想,任何复杂程序都可由顺序结构、分支结构、循环结构等构成。 如图1所示。 顺序结构分支结构

图 (a) 图 (b) 循环结构 出口 图 (c) 图1 常用程序结构 一、顺序程序举例 例1、设在外RAM的60H单元存有1个字节代码,要求将其分解成两个4位字段,高4位存入原单元的低4位,其低4位存入61H单元的低4位,且要求这两个单元的高4位均为0,试编制完整程序。 解:字节分解: 核心指令 ANL ORL 1000H MODE:MOV R0,#60H MOVX A,@R0 MOV B,A ANL A,#0F0H SWAP A

MOVX @R0,A ANL B,#0FH MOV A,B INC R0 MOVX @R0,A END 二、分支结构与分支程序设计 结构:根据不同的条件,进行相应的处理。 通常用条件转移指令形成简单分支结构。 如:判(A) = Z 或 NZ ,转移 判(CY)= 1 或 0 ,转移 判(bit)=1 或 0 ,转移 CJNE 比较不相等转移 例3、设a存放在累加器A中,b存放在寄存器B中,要求按下式计算Y值,并将结果Y存于累加器A 中,试编写程序。 a-b (a≥0) Y = a+b (a < 0) 解:本题关键是判a是正数,还是负数;由ACC7便知。 ORG 1000H BR: JB ACC7,MINUS CLR C SUBB A,B SJMP DONE MINUS: ADD A,B DONE: SJMP $ END 例4、设有两个16位无符号数NA,NB分别存放在8031单片机内部RAM的40H、41H及50H、51H 单元中,当NA > NB时,将内部RAM的42H单元清0;否则,将该单元置成全1,试编程。解法I:因为无16位数的比较指令,所以,只能用8位数的比较指令。 (画出流程框图) ORG 2000H CMP:MOV A,50H CJNE A,40H,CMP1 MOV A,51H CJNE A,41H,CMP1 SJMP NHIGHE

第8章指针1练习答案

指针1 选择题 1.如下程序段: int *p ,a=10 ,b=1 ; p=&a ;a=*p+b ; 执行该程序段后,a 的值为。 A. 12 B. 11 C. 10 D. 编译出错 2.若有以下定义和语句: double r=99 ,*p=&r ; *p=r ; 则以下正确的叙述是。 A. 以下两处的*p 含义相同,都说明给指针变量p 赋值 B. 在"double r=99,*p=&r;"中,把r 的地址赋值给了p 所指的存储单元 C. 语句"*p=r;"把变量r 的值赋给指针变量p D. 语句"*p=r;"取变量r 的值放回r 中 3.若有说明int *p,a;则能通过scanf语句正确给a存入数据的程序段是()。 A.p=&a; scanf(“%d”,p); B.scanf(“%d”,a); C.p=&a; scanf(“%d”,*p); D.*p=&a; scanf(“%d”,p); 4.若int x ,*pb;,则正确的赋值表达式是。 A. pb=&x B. pb=x; C. *pb=&x; D. *pb=*x 5.若有说明:int i, j=2,*p=&i;,则能完成i=j 赋值功能的语句是。 A. i=*p; B. *p=*&j; C. i=&j; D. *p=i; 6.若已定义:int a[9] ,*p=a;并在以后的语句中未改变p 的值,不能表示a[1]地 址的表达式是()。 A. p+1 B. a+1 C. a++ D. ++p 7.若有以下说明:int a[10]={1,2,3,4,5,6,7,8,9,10} ,*p=a ; 则数值为6 的表达式是( )。 A. *p+6 B. *(p+6) C. *p+=5 D. p+5 8.以下程序段的运行结果是()。 int a[10]={1,2,3,4,5,6,7,8,9,10}; int *p=&a[3],*q; q=p+2; printf(“%d”,*p+*q); A.16 B.10 C.8 D.6

指针1

指针 一、指针概述 1. 地址 C++程序中每一个实体,如变量、数组和函数等,都要在内存中占有一个可标识的存储区域。每一个存储区域由若干个字节组成,在内存中,每一个字节都有一个“地址”,一个存储区的“地址”指的是该存储区中第一个字节的地址。 2.指针 指针就是存储区域的地址。一个地址指向一个程序实体的存储空间。 直接访问:通过变量名或地址访问程序中一个实体的存储空间的方式(其实通过变量名访问也就是通过地址访问)。 间接访问:把一个变量的地址放在另一个变量中。 3.指针变量 专门用来存放地址的变量就叫指针变量,需要专门加以定义。 二、指针的类型与指针的定义 指针也是具有类型的。指针的类型就是它所指向的变量的类型。例如,一个指向int型的指针,一个指向一维数组的指针。 在使用一个指针变量之前,先要用声明语句对其进行定义。例如:int *p; 定义了一个指向整型数据的指针变量p。即p是一个存放整型变量地址的变量。 应当特别注意的是,定义一个指针变量必须用符号“*”,它表示其后的变量为指针变量,指针变量为p,而不是*p。 要想使一个指针变量指向一个变量,必须将变量的地址赋给指针变量。例如:

int *p, i=3; p=&i; 指针变量也可以定义为指向实型、字符型以及其它类型的变量。如: float *p ; char *q ; 三、指针运算符 在C++语言中,有两个有关指针的运算符: &:为取地址运算符,&x的值为x的地址。 * :指针运算符,或称指向运算符,也称间接运算符,*p代表p 所指向的变量。如: int a=15, *p; p=&a; cout<

指针实验

实验名称:指针使用 实验目的:熟悉指针的正确用法。 相关知识:1.指针的定义;2.指针的引用; 实验内容: (1) 调试下面程序,指出错误原因。 main ( ) { int x=10,y=5,*px,*py; px=py; px=&x; py=&y; printf(“*px=%d,*py=%d”,*px,*py); } (2)调试下面程序。 #include main ( ) { float a; float *pa; scanf(“%f”,&a); printf(“1.%f\n”,a); pa=&a; scanf(“%f”,pa); printf(“2.%f\n”,a); } 在上述程序中,添加如下语句。 printf(“%x”,&a); printf(“%x”,pa); printf(“%x”,pa+1); ①记录这3条语句的输出值。其中“%x”表明输出的数值用十六进制数表示。 ②计算float类型所占空间的大小。 ③运算符sizeof可以计算出某一类型或变量所占存储空间的大小。请在上述程序中加入语句:printf(“%ld”,sizeof(float));将该语句的输出结果与步骤②的结果比较,观察是否一致。

(3)调试下面程序。 #include main ( ) { float a,b; float *pa=&a,*pb=&b; printf(“%x\n”,pa+pb); printf(“%x\n”,pa-pb); printf(“%x\n”,pa+5); printf(“%x\n”,pa-5); } 记录出错信息,分析出错原因。总结指针可以进行哪些运算。 下面的程序能获得上述运行结果吗? main( ) { char *s=”COMPUTER”; char c; printf(“which style you want to \n”); printf(“capital (c) or uncapital (u);”); c=getchar(); if (c=’c’) puts(s); else { s=”computer”; puts(s); } }

第八章 二级c语言

第八章变量的地址和指针 变量:整 int 4B 单精度 float 4B 双精度 double 8B 存储空间:随机存放 short int a,b; float c,d; a 2B b 2B c 4B d 4B 1012 1013 1018 1019 2010 2011 2012 2013 3033 3034 3035 3036 变量的地址:该变量所占存储单元的第一个字节的 地址 &a=1012 p a *定义一个指针变量用于存放地址 4039 1012 地址就是指针 1.指针变量:存放(指向)不同地址的指针 定义:类型说明 *变量名; int *p; (指向一个整型变量) float *f;

2.给指针变量赋值 (1)int a,*p; p=&a; /*将a变量的地址赋给指针p*/ (2)初始化赋值 int a,*p=&a; 3.赋值形式: (1)赋值运算 int a,*p; p=&a; 注意:p=1000; (错误) (2)初始化赋值 int a,*p=&a; (3)把一个指针变量的值送给相同类型的另一个指针变量 int a,*pa,*pb; pa=&a; pb=pa; /*两个指针同时指向a*/ (4)把数组的首地址,送给指针变量

(数组名就表示数组的首地址) int b[5],*p; p=b; 或者 p=&b[0] (也可以指在数组中间 p=&b[2]) (5)把字符串的首地址送给字符型的指针变量 char *p; p="abcdef"; (把字符串的首地址送给p) 4.指针变量的运算 &:取地址符号 *:取内容运算符(把指针所指变量内容取出来) 优先级相同 main() {int a,*p=&a; a=5; printf("%d\n",*p); printf("%d\n",p); printf("%d\n",&p);}

指针用来指向一个地址

指针用来指向一个地址。使用这种寻址方式的优点在于可以在程序运行过程中实现变址。指针用于存储器间接寻址 程序中用于存储器间接寻址的语句包含一个指令、一个地址标识符、以及一个偏移量(偏移量必须在方括号内给出)。 下面给出一个双字格式的指针的例子: L P#8.7把指针值装载到累加器1 T I[MD2]把指针值传送到MD2 A I[MD2]查询I8.7的信号状态 =Q[MD2]给输出位Q8.7赋值 存储区域内部寻址及交叉寻址:程序中采用这些寻址方式的语句包含一个指令以及下列内容:地址标识符、地址寄存器标识符、偏移量。地址 寄存器(AR1、AR2)及偏移量必须写在方括号内。 存储区域内部寻址例程:指针不包含指示存储区域的信息: L P#8.7把指针值装载到累加器1 LAR1把指针从累加器1装载到AR1 A I[AR1,P#0.0]查询I8.7的信号状态 =Q[AR1,P#1.1]给输出位Q10.0赋值 偏移量0.0不起作用。输出Q10.0等于8.7(AR1)加偏移量1.1。结果是10.0,而不是9.8。 存储区域交叉寻址例程:在存储区域交叉寻址中,指针中包含指示存储区域的信息(例子中为I和Q)。 L P#I8.7把指针值及存储区域标识装载到累加器1 LAR1把存储区域I和地址8.7装载到AR1 L P#Q8.7把指针值和地址标识符装载到累加器1 LAR2把存储区域Q和地址8.7装载到AR2 A[AR1,P#0.0]查询输入位I8.7的信号状态 =[AR2,P#1.1]给输出位Q10.0赋值 偏移量0.0不起作用。输出Q10.0等于8.7(AR2)加偏移量1.1。结果是10.0,而不是9.8,

C语言指针实验报告

C语言程序设计实验报告 1实验目得 (1)掌握指针得概念,会定义与使用指针变量; (2)能正确使用变量得指针与指向变量得指针变量; (3)能正确使用数组得指针与指向数组得指针变量; (4)能正确使用字符串得指针与指向字符串得指针变量; 2实验内容 将一个任意整数插入到已排序得整形数组中,插入后,数组中得数仍然保持有序; 要求: (1)整形数组直接由赋值得方式初始化,要插入得整数有scanf()函数数入; (2)算法实现过程采用指针进行处理; (3)输入原始数据以及插入整数后得数据,并加以说明;

3算法描述流程图

4源程序 #include main() { int a[100],m,i,*p,n,w; printf("请输入要输入得数组得元素个数:\n"); scanf("%d",&n); printf("请输入已排好序得数组:\n"); for(i=0;i=w;i--) { a[i+1]=a[i]; } a[i+1]=m; for(i=0;i<=n;i++) { printf("%-4d",a[i]); } printf("\n"); } 5测试数据 “1,3,5,7,9,11,13,15,17,19······10” 6运行结果 7出现问题及解决方法 在编写过程中,

for(i=n-1;a[i]>=w;i--) { a[i+1]=a[i]; } a[i+1]=m; 这一步没有注意a[i++]=m与a[i+1]=m中i++与i+1不同,a[i++]=m就是先将得值赋给a[i],然后在执行自增;而在实验过程中忽略了这一点,造成了不必要得麻烦; 8实验心得 通过这次指针实验掌握了指针得概念,会定义与使用指针变量,并且能利用指针来简单化一些问题,给以后得编程带来了很大得便利;

计算机二级c语言第八章 指针习题

第八章指针 一、选择题 1、设有定义:int n1=0,n2,*p=&n2,*q=&n1;,以下赋值语句中与n2=n1;语句等价的是 A)*p=*q; B)p=q; C)*p=&n1; D)p=*q; 2、若有定义:int x=0, *p=&x;,则语句printf("%d\n",*p);的输出结果是 A)随机值 B)0 C)x的地址 D)p的地址 3、以下定义语句中正确的是 A)char a='A'b='B'; B)float a=b=10.0; C)int a=10,*b=&a; D)float *a,b=&a; 4、有以下程序 main() { int a=7,b=8,*p,*q,*r; p=&a;q=&b; r=p; p=q;q=r; printf("%d,%d,%d,%d\n",*p,*q,a,b); } 程序运行后的输出结果是 A)8,7,8,7 B)7,8,7,8 C)8,7,7,8 D)7,8,8,7 5、设有定义:int a,*pa=&a;以下scanf语句中能正确为变量a读入数据的是 A)scanf("%d",pa) ; B)scanf("%d",a) ; C)scanf("%d",&pa) ; D)scanf("%d",*pa) ; 6、设有定义:int n=0,*p=&n,**q=&p;则以下选项中,正确的赋值语句是 A)p=1; B)*q=2; C)q=p; D)*p=5; 7、有以下程序 void fun(char *a,char *b) { a=b; (*a)++; } main () { char c1='A', c2='a', *p1, *p2; p1=&c1; p2=&c2; fun(p1,p2); printf("%c%c\n",c1,c2); }程序运行后的输出结果是 A)Ab B)aa C)Aa D)Bb 8、有以下程序 #include main() { printf("%d\n", NULL); } 程序运行后的输出结果是 A)0 B)1 C)-1 D)NULL没定义,出错 9、已定义以下函数 fun(int *p) { return *p; } 该函数的返回值是 A)不确定的值 B)形参p中存放的值

常用元器件识别及检测(一)

常用电子元器件识别及检测(一) 各种电子设备上都普遍采用的元器件称为通用元器件,它们主要有电阻器、电容器、电感、变压器、晶体二极管、晶体三极管、集成电路、扬声器等。除此之外还有一些专用的元器件。 一、电阻器 电阻器简称“电阻”,它是家用电器以及其它电子设备中应用十分广泛的元件。电阻器利用它自身消耗电能的特性,常用于控制电路电流和电压的大小,在电路中起降压、分压、限流、向各种电子元件提供必要的工作条件(电压或电流)等几种功能 。表示符号为“R ”,基本单位是Ω,功率用W表示。 电阻的基本概念 ? 各种材料的物体对通过它的电流呈现一定的阻力,这种阻碍电流的作用叫作电阻。 ? 电阻R 在数值上等于加在电阻器上的电压U 与电流I 之比,即 ? R=U/I 电阻的常用单位为欧姆(Ω)、千欧(K Ω)和兆欧(M Ω). ? 1 K Ω=1000Ω; 1M Ω=1000K Ω=106Ω 常见的电阻器有下列几种: (1)色环电阻(金属膜、碳膜电阻) (2)线绕电阻器 (3)电阻网络器(排阻) ----汉达制作----28 特殊电 阻 、压敏MY 、力敏ML 、磁敏 MC 和气敏MQ 等 。 可调电阻器(电位器): (a )绕线电位器阻值变化范围小,功率较大。 (b )碳膜电位器稳定性较高,噪声较小。 (c )推拉式带开关碳膜电位器使用寿命长,调节方便。 (d )直滑式碳膜电位器节省安装位置,调节方便。 普通贴片电阻精密贴片电阻大功率线绕电阻 碳膜电阻

电 法 国产电阻器的型号由四部分组成(不适用敏感电阻) 第一部分:主称 ,R 表示电阻,W 表示电位器。 第二部分:材料 ,T-碳膜、H-合成碳膜、S-有机实心、N-无机实心、J-金属膜、Y-氧化膜、C-沉积膜、I-玻璃釉膜、X-线绕。 第三部分:分类,1-普通、2-普通、3-超高频 、4-高阻、5-高温、6-精密、7-精密、8-高压、9-特殊、G-高功率、T-可调。 第四部分:序号,用数字表示,表示同类产品中不同品种,以区分产品的外型尺寸和性能 电阻器的标志内容及识别方法 色环电阻判别要点: 1、最靠近电阻引线一边的色环为第一色环。 2、两条色环之间距离最宽的边色环为最后一条色环。 3、最宽的边色环为最后一条色环。 4、四环电阻的偏差环一般是金或银。 5、有效数字环无金、银色。(解释:若从某端环数起第1、2环有金或银色,则另一端环是第一环。) 6、偏差环无橙、黄色。(解释:若某端环是橙或黄色,则一定是第一环。) 7、试读:一般成品电阻器的阻值不大于22M Ω,若试读大于22M Ω,说明读反。 8、五色环中,大多以金色或银色为倒数第二个环 。 应注意的是有些厂家不严格按第1、2、3条生产,以上各条应综合考虑。 电阻器的质量检测 电阻器的质量好坏是比较容易鉴别的,对新买的电阻器先要进行外观检查,看外观是否端正、标志是否清晰、保护漆层是否完好。然后可以用万用表的电阻档测量一下电阻器的阻值,看其阻值与标称阻值是否一致,相差之值是否在允许误差范围之内。 检测半可调电阻器的质量时,先用万用表测量整个电阻的总阻值,然后再将万用表的表笔分别接在其中的一个固定端和活动端,同时慢慢的调动阻值,在万用表上看电阻值的大小是否连续变化由大到小或由小到大。如阻值能连续变化说明半可调电阻器是好的。 检测电位器的质量时,先用万用表测量电位器1-3端的总阻值,然后看是否在标称范围内;再用万用表笔接于1-2端或2-3端间,同时慢慢转动电位器的轴,看万用表的指针是否连续、均匀地变化,如不连续(调动)或变化过程中电阻值不稳定,则说明内部接触不良;然后测量电位器开关4-5端是否起作用,接触是否良好;最后测量电位器各端子与外壳(金属)及旋转轴间的绝缘电阻是否接近。 电阻器的常见故障有:短路、断路及老化等三种。 电位器 微调电阻

c语言指针实验报告

C语言实习报告 题目:指针及其应用 系别: 专业: 姓名: 学号: 日期:

一实验名称:指针及其应用 二实验目的: (1)掌握变量的指针及其基本用法。 (2)掌握一维数组的指针及其基本用法。 (3)掌握指针变量作为函数的参数时,参数的传递过程及其用法。 三实验内容: (1)运行以下程序,并从中了解变量的指针和指针变量的概念。 (2)运行以下程序,观察&a[0]、&a[i]和p的变化,然后回答以下问题: 1.程序的功能是什么? 2.在开始进入循环体之前,p指向谁? 3.循环每增加一次,p的值(地址)增加多少?它指向谁? 4.退出循环后,p指向谁? 5.你是否初步掌握了通过指针变量引用数组元素的方法? (3)先分析以下程序的运行结果,然后上机验证,并通过此例掌握通过指针变量引用数组元素的各种方法。

(4)编写函数,将n个数按原来的顺序的逆序排列(要求用指针实现),然后编写主函数完成: ①输入10个数; ②调用此函数进行重排; ③输出重排后的结果。 四分析与讨论: (1)指针的定义方法,指针和变量的关系。 定义方法: 数据类型 *指针变量名; 如定义一个指向int型变量的指针—— int *p;

则我们可以继续写如下代码—— int a = 4; p = &a; printf("%d", *p); 在这里,我们定义了一个变量a,我们把它理解为内存空间连续的4个字节(int型占用4字节),则这4个字节的空间保存着一个数4。&是取地址符号,即把变量a的地址(即这4个字节的首地址)赋给指针p (记住指针p的类型和变量a的类型要保持一致,否则的话,要进行类型转换)。这样子,指针p就保存着变量a的地址。我们如果把指针p当做内存空间里面另外一个连续的4个字节,那么这4个字节保存的数就是变量a的地址。printf("%d",*p)和printf("%d",a)的结果是一样的。这里的*是取变量符号(与&刚好作用相反,通过变量的地址找到变量),与定义时int *p的*号作用不同(定义时的*表示该变量是个 指针变量,而非是取它指向的变量)。 (2)数组和指针的关系。 指针与数组是C语言中很重要的两个概念,它们之间有着密切的关系,利用这种关系,可以增强处理数组的灵活性,加快运行速度,本文着重讨论指针与数组之间的联系及在编程中的应用。 1.指针与数组的关系 当一个指针变量被初始化成数组名时,就说该指针变量指向了数组。如: char str[20], *ptr; ptr=str; ptr被置为数组str的第一个元素的地址,因为数组名就是该数组的首地址,也是数组第一个元素的地址。此时可以认为指针ptr就是数组str(反之不成立),这样原来对数组的处理都可以用指针来实现。如对数组元素的访问,既可以用下标变量访问,也可以用指针访问。 2.指向数组元素的指针 若有如下定义: int a[10], *pa; pa=a; 则p=&a[0]是将数组第1个元素的地址赋给了指针变量p。 实际上,C语言中数组名就是数组的首地址,所以第一个元素的地址可以用两种方法获得:p=&a[0]或p=a。 这两种方法在形式上相像,其区别在于:pa是指针变量,a是数组名。值得注意的是:pa是一个可以变化的指针变量,而a是一个常数。因为数组一经被说明,数组的地址也就是固定的,因此a是不能变化的,不允许使用a++、++a或语句a+=10,而pa++、++pa、pa+=10则是正确的。由此可见,此时指针与数组融为一体。 3.指针与一维数组 理解指针与一维数组的关系,首先要了解在编译系统中,一维数组的存储组织形式和对数组元素的访问方法。 一维数组是一个线形表,它被存放在一片连续的内存单元中。C语言对数组的访问是通过数组名(数组的起始地址)加上相对于起始地址的相对量(由下标变量给出),得到要访问的数组元素的单元地址,然后再对计算出的单元地址的内容进行访问。通常把数据类型所占单元的字节个数称为扩大因子。 实际上编译系统将数组元素的形式a[i]转换成*(a+i),然后才进行运算。对于一般数组元素的形式:<数组名>[<下标表达式>],编译程序将其转换成:*(<数组名>+<下标表达式>),其中下标表达式为:下标表达式*扩大因子。整个式子计算结果是一个内存地址,最后的结果为:*<地址>=<地址所对应单元的地址的内容>。由此可见,C语言对数组的处理,实际上是转换成指针地址的运算。 数组与指针暗中结合在一起。因此,任何能由下标完成的操作,都可以用指针来实现,一个不带下标的数组名就是一个指向该数组的指针。

第8章 善于利用指针(1)

内存管理指针的基本概念指针应用实例指针作函数参数第8章指针(1)

复习回顾 上次课的内容: ◆局部变量和全局变量 ◆变量的作用域 ◆变量的生存期 ◆声明与定义 ◆内部函数 ◆外部函数◆你开始习惯写函数了吗? 2012是如何实现的?假定造成世界末日的上帝是一个程序员,作为一名合格的程序员,他绝不应该写出类似于“摧毁地球”这样的程序,而应该写一个“摧毁(行星)”的函数,然后把地球作为参数传进去!

C语言新手的晋级之路 第一步:萧规曹随 ◆在这一步要求按照教材或讲义上的程序实例进行原样 输入,运行一下程序看是否正确。 ◆在这一步,掌握C语言编程软件的使用方法(包括新 建、打开、熟练输入、编辑、保存、关闭C程序); 初步记忆新学章节的知识点;养成良好的编程风格( 是讲义提倡的而不是教材上的) ◆难点:小心数字1和字母l,字母o和数字0,中英文标 点符号的区别

C语言新手的晋级之路 第二步:移花接木 ◆在第一步输入的C程序的基础上进行试验性的修改, 运行一下程序看一看结果发生了什么变化,分析结果变化的原因,加深新学知识点的理解。 ◆可与第一步同步进行,“输入”可加深记忆,“修改 ”可加深理解,二者相辅相成,互相促进。 ◆友提,一次进行一处修改即可,免得把自己改晕了。

C语言新手的晋级之路 第三步:无中生有 ◆面对教材的例子题目,不参考教材,自己从头开始编 写程序。看能否写出正确运行的代码。 ◆初学者易犯的错误:scanf格式控制和输入不匹配或把变量 名当地址作参数,使用未定义的变量、漏掉或多写“;”、“{” 与“}”、“(”与“)”不匹配,控制语句(选择、分支、循环)的格式不正确,调用库函数没有包含相应头文件,调用未声明 的函数、调用函数时实参和形参不匹配、数组边界越界等等 ◆要学会看编程工具的错误信息提示:双击错误提示光标可 跳转到发生错误的行,如果该行没有错误就往前查找。错误要一 个一个修改,每改完一次编译一下程序。

【实验指导书】实验7:指针 (1)

(2014~2015学年-第1学期) 1. 理解指针、地址和数组间的关系。 2. 掌握通过指针操作数组元素的方法; 3. 掌握数组名作为函数参数的编程方式。 4. 掌握通过指针操作字符串的方法。 5. 了解掌握使用断点调试程序的方法。 二、实验环境: 操作系统:Window 8 编译环境:CodeBlock 13.02 三、实验要求及内容(根据实验要求,将整个实验过程需要的数据和截屏记录于此,并整理成实验步骤。): 1.设计一个程序计算输入的两个数的和与差,要求自定义一个函数sum_diff(float op1,float op2,float *psum,float *pdiff),其中op1和op2是输入的两个数,*psum和*pdiff是计算得出的和与差。 解: (1)流程图如图1所示: 图1 程序7-1的流程图

图2 实验7-1实验源代码 (3)运行结果(测试用例) 实验7-1运行结果如图3所示 图3 实验7-1运行结果 2. 输入n 个正整数,使用选择法将它们从小到大排序后输出。要求:利用所学指针的内容实现。 提示:在指针这一章所学的冒泡排序算法基础上改写。 解: (1)流程图如图1所示: 图1 程序7-2的流程图

图2 实验7-2实验源代码(3)运行结果(测试用例)实验7-2运行结果如图3所示 图3 实验7-2运行结果

3. 输入10个整数存入数组a ,再输入一个整数x ,在数组a 中查找x ,若找到则输出相应的下标,否则显示“Not found ”。要求定义和调用函数seach(int list[],int n ,int x),在数组list 中查找元素x ,若找到则返回相应的下标,否则返回-1,参数n 代表数组list 中元素的数量。试编写相应程序。 解:(1)流程图如图1 7-3的流程图 (2)源代码 源代码如图2所示

实验11 指针(1)

实验11 指针(1) 一、实验目的: 1、通过查看变量地址,了解不同类型数据在内存存储情况;理解用指针获取内存数据的两个关键点:首地址、数据类型(决定占用的存储单元的个数、数据存储方式); 2、掌握指针变量的定义方法、=(赋值)、&(取地址)、*(取内容,间接访问); 3、能够用指针变量作函数参数,实现通过函数调用得到n个要改变的值: 4、掌握指针变量p的算术运算:p±n(n为整数)、p++(p--)、++p(--p),理解移动一个数据单位的真实含义; 5、能够用数组名或指针变量作函数形参,在函数中实现对数据的批量处理。 二、实验内容 1、(基础题)根据注释填写程序所缺代码,然后运行程序,并回答相关问题: #include int main() { char ch1='I',ch2='Q'; int n1=1, n2=6; double d1=1.25,d2=20.5; //定义两个指针变量pch_1、pch_2分别指向ch1、ch2 ___________(1)____________ //定义两个指针变量pn_1、pn_2分别指向n1、n2 ___________(2)____________ //定义两个指针变量pd_1、pd_2分别指向d1、d2 ___________(3)____________ //分别输出上述ch1、ch2、n1、n2、d1、d2六个变量的地址(即六个指针变量的值) ___ ________(4)__ _________ ___ ________(5)__ _________ ___ ________(6)__ _________ //用间接存取方式输出ch1、ch2、n1、n2、d1、d2六个变量的值 ___ ________(7)__ _________ ___ ________(8)__ _________ ___ ________(9)__ _________

C语言实验六实验报告——指针

一、实验项目名称 指针 二、实验目的 1.掌握指针的基本概念和基本用法。包括:变量的地址和变量的值,指针变量的说明、指针变量的初始化、指针的内容与定义格式、指针的基本运算等; 2.掌握数组与指针的关系并能够利用指针解决数组的相关问题; 3.掌握字符串与指针的关系并能够利用指针处理字符串的问题; 4.掌握指针与函数的关系并能够利用指针处理函数问题; 5.了解指向指针的指针的概念及其使用方法; 6.能够使用指针进行程序设计。 三、实验内容 有关指针的程序设计 1.编程实现:任意输入的10个数,求其平均值。 要求: (1)10个数采用scanf语句读入。 (2)利用指针实现对这10个数的访问。 (3)要求平均值的精度为小数后面2位。 2.编程实现:将一个任意整数插入到一个已排序的整数数组中,插入后数组中的数仍然保持有序。 要求: (1)整数数组由初始化方式输入。任意整数由scanf函数输入; (2)实现过程采用指针处理; (3)输出原始数组数据以及插入数据后的数组数据并加以相应说明。 3.编写函数newcopy(char *new,char *old),它的功能是删除old所指向的字符串中的小写字母,并将所得到的新串存入new中。 要求: (1)在主函数中以初始化方式输入一个字符串; (2)调用newcopy()函数; (3)在主函数中输出处理后的结果。 4.编程实现:输入三个整数,按由大到小的顺序输出。

要求: (1)通过scanf函数输入三个数据并存入三个变量中; (2)利用指针实现从大到小输出; (3)修改程序,将三个整型数据改为字符型数据,输入三个字符,按从大到小数顺序输出; (4)修改程序,将三个字符型数据改为字符串数据,输入三个字符串,按从小到大顺序输出; (5)体会指针对不同数据处理的特点。 四、实验步骤及结果 一、 #include <> void main() { int a[10],n,sum=0; float aver;/* 定义平均数为浮点型*/ int *p=a;/*初始化*/ printf("Please input 10 numbers:\n"); for (n=0;n<10;++n) scanf("%d",&a[n]);/*输入十个数*/ for (n=0;n<10;++n) sum=sum+*(p+n);/*使用指针访问数据*/ aver=(float)sum/n; printf("Average is %.2f",aver);/*精确到小数点后两位*/ } 二、 #include <> void arr(int *a,int n);/*定义排序函数*/ void insert(int *a,int num);/*插入并排序函数*/ int n=10;/*定义数据个数,可修改*/ void main()

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 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选项中,函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型;A选项中,虽然不同基类型的指针变量占用字节数是相同的,但是不能混用。因此D选项正确。 5.如果定义 float a[10], x; 则以下叙述中正确的是

相关文档
最新文档