第八章地址和指针
第八章地址和指针
8.1变量的地址和指针
在程序中变量实际上代表了内存中的某个存储单元。那么C是怎样存取这些单元的数据内容的呢?
我们知道计算机的内存是以字节为单位的一片连续的存储空间,每个内存单元都有一个唯一的编号,我们将其称为“内存地址”。计算机对数据的存取操作都是依赖于内存地址进行的。因为计算机的内存空间是连续的,所以内存中的地址空间也是连续的,并且用二进制数据来表示,为了方便和直观,我们将用十进制数据进行描述。
若在程序中定义了一个变量,C编译系统就会自动根据变量的类型,为其分配一定字节数量的存储空间。如int型2个字节,float型4个字节,double型8个字节,char型1个字节等。此后,这个变量的内存地址也就唯一的确定了。
一般情况下,我们在程序中只要给出变量名,不需要知道每个变量在内存中的具体地址,变量与地址之间的联系由C编译系统来完成。程序中我们对变量进行存取操作,实际上就是对变量地址的存储单元进行操作。这种直接按照变量地址进行存取的操作方式称为“直接存取”方式。
在C语言中我们还可以定义一种特殊的变量,这种变量只是用于存放内存变量地址的。如:p93 图8.2
这种通过变量p间接得到变量a的地址,然后再存取变量a的值的方式称为“间接存取”的方式。这种用来存放地址的变量称为“指针变
量”或“指针”。
由此我们可以知道,在C语言中,地址是指变量在内存中的存放的位置,即存放该变量的内存单元的名字。而指针是指一个变量,在该变量中存放的是其指向的那个变量在内存存储单元的地址。也就是说,变量的地址就可以理解为指针。
在C语言中,指针被广泛使用,他可以使程序简洁并高效运行,但使用不当就会产生意料不到的严重后果。因此,正确使用和掌握指针是十分必要的。
8.2 指针变量的定义和基本类型
定义指针变量的形式:
类型名*指针变量名1,*指针变量名2,……;
例如:
int *pi,*pj;
float *i,*j,*k;
double *l,*m,*n;
char *c,*s;
在每个变量前面的星号*是一个指针说明符,用来说明该变量是指针类型。变量前面的星号*不可以省略。指针变量名前面的类型定义是说明指针指向的数据类型。
另外,我们还可以定义一个指向指针的指针变量。定义形式为:
类型名**指针变量名1,**指针变量名2,……;
例如:
int * * p,*s,k=90;
s=&k; p=&s;
其中&符号表示取变量的内存单元地址运算,后面介绍。
为什么指针变量要有类型之分呢?
如前面所述,指针变量中存放的是一个内存单元的地址,这里“一个内存单元”中的“一”所代表的字节数是不同的。如int型2个字节,float型4个字节,double型8个字节,char型1个字节等。在后面的指针运算中我们经常要对指针进行加、减、移动等操作,此时指针操作的单位是一个存储单元,而不是一个字节,因此对于不同类型的指针变量来说,其操作时所跨越的内存字节数是不同的。如:定义一个指针变量i(存放的初始地址为2060H),当我们执行i++操作时,不同类型的指针变量所移动的字节数是不同的。
8.3 指针变量赋值
一、给指针变量赋地址值
一个指针变量可以通过不同的方式获得一个确定的地址值,从而指向一个具体的操作对象。
1、通过取地址运算符(&)获得地址值
单目运算符“&”的作用是用来获取变量的内存单元地址。其使用格式为:&变量名。
如:int k=80, h=100, *p, *q; 则赋值语句为
p=&k; q=&h;
其指向关系见书p94图8.3
我们可以说:指针p指向了整型变量k,和指针q指向了整型变量h。即:指针变量p中存放了整型变量k所在的存储单元地址,和指针变量q中存放了整型变量h所在的存储单元地址。
取地址运算符(&)只能够用于变量和以后将要介绍的数组元素,不能够应用于表达式、常量或者被说明为register的变量(第12章介绍)。另外,&符号必须要放在运算对象的左边,而且运算对象的类型必须与指针变量的基本类型相同。
在调用scanf函数时,我们输入的各变量之前必须要加&符号。
如:scanf (“%d%c%f”, &a, &b, &c );
2、通过指针变量获得地址值
我们可以通过赋值,把一个指针变量中地址赋给另一个指针变量,从而使两个指针变量指向同一个地址。
如:int k=80, *p, *q;
p=&k; q=p;
此时,指针变量p 和q都同时指向了整型变量k 所在的内存单元地址。但是要注意,进行赋值运算时,赋值号两边指针变量的基本类型必须要相同。
二、给指针变量赋“空”值
有时我们还需要给指针变量赋“空”值,形如:p=NULL;
NULL是在”stdio.h”头文件中定义的预定义符号,因此在使用NULL
时,应在程序的前面出现预定义行:# include “stdio.h”。NULL的ASCII代码值为0,当执行了以上的赋值语句后,称指针p为空指针。因此上述语句也可以书写为:p=’\0’;或p=0;
这时p并不指向地址为0的存储单元,而是具有一个确定的值——“空”。
8.4 对指针变量的应用
一、通过指针来引用一个存储单元
C语言提供了一个可以间接访问地址的单目运算符:星号“*”。当指针变量中存放了一个确定的地址值时,就可以使用指针访问运算符对存储单元中的数据进行访问。
如:int *p, i=10, j;
p=&i;
则以下赋值语句:j=*p;的作用是将变量i 的值赋予变量j,这里*p 代表指针p 所指向的变量i。等价于j=i;
间接地址访问运算符是一个单目运算符,必须出现在运算对象的左边,其运算对象或者是存放地址的指针变量或者是内存单元地址。例如:j=*(&i);
由于运算符*和&的优先级别相同,且结合方向为自右至左,因此表达式中的括号可以省略。写成:j=*&i;
又例如:j=*p+1;由于*的运算优先级高于+,因此语句功能为:取指针变量p所指向的存储单元中的内容并加1后送给变量j。
有例如:int *p, k=0;
p=&k;则语句*p=100;的作用是将整数100送给变量k。等价于k=100。
此后若有语句*p=*p+1;
则功能为:取指针变量p中所指存储单元中的数据,加1后再存放到指针变量p 所指的存储单元中。相当于k++或k=k+1;
以上语句还可以书写成:
*p+=1;或++*p;或(*p)++;
注意:在表达式+ + * p中,++和*两个运算符的优先级相同,但按照自右至左的方向结合,因此++*p等价于++(*p)。而在表达式(*p)++中,一对括号不可以缺少,(*p)++表示先取指针变量p所指向的存储单元中的值,然后加1作为表达式的值。不可以写成*p++,否则将先计算*p作为表达式的值(在此为100),然后使指针变量p自身增1,所以*p++并不使p所指内存单元的数据加1,而是将指针向后移动了一个存储单元。
例如:用指针指向两个变量,通过指针运算选出值大的那个数据。# include “stdio.h”
main ( )
{ int a, b,max, *pa, *pb, *pmax;
pa=&a; pb=&b; pmax=&max;
printf (“input a and b:”);
scanf (“%d%d”, &a,&b); // scanf (“%d%d”, pa,pb);
printf ( “a=%d b=%d\n”, a, b);
*pmax=*pa;
if ( *pa<*pb ) *pmax=*pb;
printf ( “max=%d\n”, max );//printf ( "max=%d\n", *pmax );
}
二、移动指针
所谓移动指针就是对指针变量加上或减去一个整数,或通过运算使指针变量指向其他存储单元。因此,只有当指针指向一个连续的存储单元时,指针的移动才有意义。
当指针指向一个连续的存储单元时,即可以对指针变量进行加减运输,也可以对指针进行逻辑和其它C语言支持的运算。
例如:假定在内存中开辟了下列6个int型存储单元,如下表所示编号a[0] a[1] a[2] a[3] a[4] a[5]
数据
地址2001H 2003H 2005H 2007H 2009H 200BH 指针p↑q↑
则分别执行下列语句后,运行结果分别是什么?
(1)p++; (2)q++; (3)q=p+2; (4)a=q-p;
(5)a=*p; (6)a=*q; (7)a=*(p+2) (8)a=*p++;
(9)a=*p+2; (10)a=p<=q;
用下列程序进行演示
# include “stdio.h”
main ( )
{ int a[6], a,, *p, *q;
a[0]=11; a[1]=22; a[2]=33; a[3]=44; a[4]=55; a[5]=66;
p=&a[1]; q=&a[4];
带入上面语句
printf ( 根据情况进行打印操作); }
通过上面例子我们可以知道,指针的运算是以存储单元为基本单位的,而不是以字节为基本单位的,因此,不同类型的数据(int、char、float、double)存储单元是不一样的。且当指针进行比较运算时,是以其所指向的地址值的大小作为依据的。
8.5 函数之间地址值的传递
一、形参为指针变量时实参和形参之间的数据传递
若函数的形参为指针变量,在调用该函数时,对应的实参也必须是基本类型相同的地址值或是已经指向某个存储单元的指针变量。
例如:从键盘输入两个数据,在子函数中完成数据交换,主函数与子函数之间的数据传递以地址的形式进行。
# include “stdio.h”
main( )
{ void swap(int * ,int * ); /* 函数声明,参数是指针类型*/ int a,b;
printf("Please input two integer numbers(a,b):");
scanf("%d,%d",&a,&b);
swap(&a,&b); /* 引用调用 */
printf("a=%d\tb=%d\n",a,b); /* 调用swap( )后a 与b 的值 */ }
void swap(int *x,int *y)
{ int temp;
temp=*x;
*x=*y;
*y=temp; /* 数据值交换,而不是地址交换*/ printf("x=%d\ty=%d\n",*x,*y);
}
在程序执行过程中,主函数调用swap 函数时,系统自动为swap 函数的形参x 和y 开辟了两个类型为int 型的指针变量,并通过实参&a 和&b 将变量a 和b 的地址传递给它们,如下图所示,这时,指针x 指向变量a ,指针y 指向变量b 。然后程序的流程转去执行swap 子函数。
在swap 函数中,形参x 和y 分别以指针的形式指向了实参变量a 和
指针变量y (形参)
变量a (实参) 变量b (实参) 指针变量x (形参)
b所在的内存单元地址,利用三条循环赋值语句实现了数据的交换,但是大家要注意,指针的位置并未发生改变和交换。
由此可见,通过地址值的传递,可以在被调用函数中完成对主调函数的数据引用与修改操作。
二、通过函数返回地址值
函数值(返回值)的类型不仅可以是简单的数据类型(如:int、char、float、double等),而且还可以是指针类型。
例如:编写程序,输入两个数据,在子函数中将较小的数据地址返回到主函数中。
# include “stdio.h”
main( )
{ int *fun(int * ,int * );
/* 函数声明,参数是指针类型;返回值也为指针类型*/
int a,b,*p;
printf("Please input two integer numbers(a,b):");
scanf("%d,%d",&a,&b);
p=fun (&a,&b); /* 引用调用*/
printf("s=%d \n",*p);
}
int *fun (int *x,int *y)
{ r eturn (*x<=*y ? x : y) ;
/* 返回较小数据的地址,返回值为指针*/ }
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具有相同大小的长度。一个指针不仅有值,而且还要确定其类型,表示它能指向什么类型的数据,决定了通过它要取用多少字节作为该变量的值。
第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
C语言第八章地址与指针
1文档来源为:从网络收集整理.word 版本可编辑. 第八章 地址和指针 第一节 变量的地址和指针 1、计算机的内存是以字节为单位的一片连续的存储空间,每一个字节都有一个编号,这个编号就成为内存地址。 2、程序中定义了一个变量,c 编译系统就会根据定义中变量的类型,为其分配一定字节数的内存空间: Short int 2 Int float 4 Double 8 char 1 指针 4 图8.1 变量在内存中所占字节的地址示意图 每个变量的地址就是指该变量所占存储单元的第一个字节的地址。 3、直接存取:程序中我们对变量进行存取操作,实际上也就是对某个地址的存储单元进行操作。这种直接按变量的地址存取变量值的方式。 4、在c 语言中,还可以定义一种特殊的变量,这种变量只 a 2001 p 3001 a b x 1012 1013 1015 1016 1201 1202 1203 1204 a
1文档来源为:从网络收集整理.word 版本可编辑. 是用来存放内存地址的。 图8.2 存放地址的指针变量示意图 通过变量p 间接得到变量a 的地址,然后再存取变量a 的值的方式称为“间接存取”方式,通常变量p 指向了变量a ,变量a 是变量p 所指向的对象。 5、用来存放指针地址的变量就称作“指针变量”。 6、“变量p 指向变量a ”的含义就是指针变量p 中存放了变量a 的地址。 7、在某些场合,指针是使运算得以进行的唯一途径。 第二节 指针的定义赋值 一、 指针变量的定义和指针变量的基本类型 1、 定义指针变量的一般形式如下: 类型名 *指针变量名1,*指针变量名2…… 说明:1)类型名是基本类型。 2)*是说明符。(而在调用的时候,代表的是存储单元中的值) 3)指针变量名是用户标识符。 例:1)int *pi,*pj; pi pj 只能存放整型变量的地址 int I,*pi;double *pj; 2)p 为一个指向指针的指针变量 2002 2002 1012 1013 p p
第八章 二级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);}
计算机二级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中存放的值
第八章地址和指针
第八章地址和指针 8.1变量的地址和指针 在程序中变量实际上代表了内存中的某个存储单元。那么C是怎样存取这些单元的数据内容的呢? 我们知道计算机的内存是以字节为单位的一片连续的存储空间,每个内存单元都有一个唯一的编号,我们将其称为“内存地址”。计算机对数据的存取操作都是依赖于内存地址进行的。因为计算机的内存空间是连续的,所以内存中的地址空间也是连续的,并且用二进制数据来表示,为了方便和直观,我们将用十进制数据进行描述。 若在程序中定义了一个变量,C编译系统就会自动根据变量的类型,为其分配一定字节数量的存储空间。如int型2个字节,float型4个字节,double型8个字节,char型1个字节等。此后,这个变量的内存地址也就唯一的确定了。 一般情况下,我们在程序中只要给出变量名,不需要知道每个变量在内存中的具体地址,变量与地址之间的联系由C编译系统来完成。程序中我们对变量进行存取操作,实际上就是对变量地址的存储单元进行操作。这种直接按照变量地址进行存取的操作方式称为“直接存取”方式。 在C语言中我们还可以定义一种特殊的变量,这种变量只是用于存放内存变量地址的。如:p93 图8.2 这种通过变量p间接得到变量a的地址,然后再存取变量a的值的方式称为“间接存取”的方式。这种用来存放地址的变量称为“指针变
量”或“指针”。 由此我们可以知道,在C语言中,地址是指变量在内存中的存放的位置,即存放该变量的内存单元的名字。而指针是指一个变量,在该变量中存放的是其指向的那个变量在内存存储单元的地址。也就是说,变量的地址就可以理解为指针。 在C语言中,指针被广泛使用,他可以使程序简洁并高效运行,但使用不当就会产生意料不到的严重后果。因此,正确使用和掌握指针是十分必要的。 8.2 指针变量的定义和基本类型 定义指针变量的形式: 类型名*指针变量名1,*指针变量名2,……; 例如: int *pi,*pj; float *i,*j,*k; double *l,*m,*n; char *c,*s; 在每个变量前面的星号*是一个指针说明符,用来说明该变量是指针类型。变量前面的星号*不可以省略。指针变量名前面的类型定义是说明指针指向的数据类型。 另外,我们还可以定义一个指向指针的指针变量。定义形式为: 类型名**指针变量名1,**指针变量名2,……;
第8章 善于利用指针(1)
内存管理指针的基本概念指针应用实例指针作函数参数第8章指针(1)
复习回顾 上次课的内容: ◆局部变量和全局变量 ◆变量的作用域 ◆变量的生存期 ◆声明与定义 ◆内部函数 ◆外部函数◆你开始习惯写函数了吗? 2012是如何实现的?假定造成世界末日的上帝是一个程序员,作为一名合格的程序员,他绝不应该写出类似于“摧毁地球”这样的程序,而应该写一个“摧毁(行星)”的函数,然后把地球作为参数传进去!
C语言新手的晋级之路 第一步:萧规曹随 ◆在这一步要求按照教材或讲义上的程序实例进行原样 输入,运行一下程序看是否正确。 ◆在这一步,掌握C语言编程软件的使用方法(包括新 建、打开、熟练输入、编辑、保存、关闭C程序); 初步记忆新学章节的知识点;养成良好的编程风格( 是讲义提倡的而不是教材上的) ◆难点:小心数字1和字母l,字母o和数字0,中英文标 点符号的区别
C语言新手的晋级之路 第二步:移花接木 ◆在第一步输入的C程序的基础上进行试验性的修改, 运行一下程序看一看结果发生了什么变化,分析结果变化的原因,加深新学知识点的理解。 ◆可与第一步同步进行,“输入”可加深记忆,“修改 ”可加深理解,二者相辅相成,互相促进。 ◆友提,一次进行一处修改即可,免得把自己改晕了。
C语言新手的晋级之路 第三步:无中生有 ◆面对教材的例子题目,不参考教材,自己从头开始编 写程序。看能否写出正确运行的代码。 ◆初学者易犯的错误:scanf格式控制和输入不匹配或把变量 名当地址作参数,使用未定义的变量、漏掉或多写“;”、“{” 与“}”、“(”与“)”不匹配,控制语句(选择、分支、循环)的格式不正确,调用库函数没有包含相应头文件,调用未声明 的函数、调用函数时实参和形参不匹配、数组边界越界等等 ◆要学会看编程工具的错误信息提示:双击错误提示光标可 跳转到发生错误的行,如果该行没有错误就往前查找。错误要一 个一个修改,每改完一次编译一下程序。
第8章-指针练习题
指针思考题 一、填空题 【1】下面函数要求用来求出两个整数之和,并通过形参传回两数相加之和值,请填空。 int add( int x, int y, ) { =x+y;} 【2】若有定义: char ch; (1) 使指针p 可以指向变量ch的定义语句是。 (2) 使指针p指向变量ch的赋值语句是。 (3) 通过指针p给变量ch读入字符的scanf函数调用语句是。 (4) 通过指针p 给变量ch赋字符A的语句是。 (5) 通过指针p输出ch中字符的语句是。 (6) 在16位微机上,指针变量p在内存中所占字节数是,变量ch在内在所占字 节数是。 二、选择题 【3】若有说明:int i,j=7,*p=&i;则与i=j;等价的语句是()。 A.i=*p; B.*p=*&j; C.i=&j; D.i=**p; 【4】若有定义:int x,*pb;则正确的赋值表达式是()。 A.pb=&x B.pb=x C. *pb=&x D.*pb=*x 【5】对于类型相同的指针变量,不能进行的运算是()。 A.< B. = C. + D. – 【6】以下程序的输出结果是()。 A.23 B. 24 C. 25 D. 26 Void fun ( int *x) { printf(%d\n”,++*x); } main( ) { int a=25; fun (&a); } 【7】以下程序的输出结果是()。 A.6 B. 7 C. 8 D. 9 main() { int k=2,m=4,n=6; int *pk=&k,*pm=&m,*p; *(p=&n)=*pk*(*pm); printf("%d\n",n); } 【8】以下程序的输出结果是()。 A.100 B. 50 C. 101 D.200 main() { int *v,b; v=&b; b=100;
指针1
指针 一、指针概述 1. 地址 C++程序中每一个实体,如变量、数组和函数等,都要在内存中占有一个可标识的存储区域。每一个存储区域由若干个字节组成,在内存中,每一个字节都有一个“地址”,一个存储区的“地址”指的是该存储区中第一个字节的地址。 2.指针 指针就是存储区域的地址。一个地址指向一个程序实体的存储空间。 直接访问:通过变量名或地址访问程序中一个实体的存储空间的方式(其实通过变量名访问也就是通过地址访问)。 间接访问:把一个变量的地址放在另一个变量中。 3.指针变量 专门用来存放地址的变量就叫指针变量,需要专门加以定义。 二、指针的类型与指针的定义 指针也是具有类型的。指针的类型就是它所指向的变量的类型。例如,一个指向int型的指针,一个指向一维数组的指针。 在使用一个指针变量之前,先要用声明语句对其进行定义。例如:int *p; 定义了一个指向整型数据的指针变量p。即p是一个存放整型变量地址的变量。 应当特别注意的是,定义一个指针变量必须用符号“*”,它表示其后的变量为指针变量,指针变量为p,而不是*p。 要想使一个指针变量指向一个变量,必须将变量的地址赋给指针变量。例如: