版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、8.1 变量的地址和指针变量的地址和指针8.2 指针变量指针变量的定义和指针变量的基的定义和指针变量的基 类型类型8.3 给指针变量赋值给指针变量赋值8.4 对指针变量的操作对指针变量的操作8.5 函数之间地址值的传递函数之间地址值的传递2022年2月12日16时32分如果在程序中定义了一个变量,在对程序进如果在程序中定义了一个变量,在对程序进行编译时,系统就会给行编译时,系统就会给该该变量分配内存单元变量分配内存单元编译系统根据程序中定义的变量类型,分配编译系统根据程序中定义的变量类型,分配一定长度的空间一定长度的空间例如,例如,VC+为整型变量分配为整型变量分配4个字节,对个字节,对单精度
2、浮点型变量分配个字节,对字符型单精度浮点型变量分配个字节,对字符型变量分配个字节变量分配个字节2022年2月12日16时32分内存区的每一个字节有一个编号,这就是内存区的每一个字节有一个编号,这就是“地址地址”,它相当于旅馆中的房间号。,它相当于旅馆中的房间号。在地址所标在地址所标识识的内存单元中存放数据,这相的内存单元中存放数据,这相当于旅馆房间中居住的旅客一样。当于旅馆房间中居住的旅客一样。由于通过地址能找到所需的变量单元,我们由于通过地址能找到所需的变量单元,我们可以说,可以说,地址指向该变量单元地址指向该变量单元。将地址形象化地称为将地址形象化地称为“指针指针”2022年2月12日16
3、时32分务必弄清楚存储单元的务必弄清楚存储单元的地址地址和存储和存储单元的单元的内容内容这两个概念的区别这两个概念的区别例如:例如:2022年2月12日16时32分int i=3,j=6,k;printf(“%d”,i);通过变量名通过变量名i找到找到i的地址的地址2000,从而,从而从从存存储单元储单元读读取取32022年2月12日16时32分int i=3,j=6,k;k=i+j;从这里取从这里取3将将9送到这里送到这里从这里取从这里取6直接存取直接存取2022年2月12日16时32分int i=3,j=6,k;定义特殊变量定义特殊变量i_pointer将将i的地址的地址存到这里存到这里间
4、接存取间接存取i_pointer=&i;*i_pointer=50;50502022年2月12日16时32分i200032000i_pointer*i_pointer20003直接存取直接存取间接存取间接存取2022年2月12日16时32分i=3;*i_pointer=3;为了表示将数值送到变量中,可以有两为了表示将数值送到变量中,可以有两种表达方法:种表达方法:(1) 将将3直接送到变量直接送到变量i所标识的单元中,例所标识的单元中,例如:如:i=3; (2) 将将3送到变量送到变量i_pointer所指向的单元所指向的单元(即变量(即变量i的存储单元),例如:的存储单元),例如:*
5、i_pointer=3; 其中其中*i_pointer表示表示i_pointer指向的对象指向的对象2022年2月12日16时32分指向就是通过地址来体现的指向就是通过地址来体现的u假设假设i_pointer中的值是变量的地址中的值是变量的地址(2000),这样就在,这样就在i_pointer和变量之间和变量之间建立起一种联系,即通过建立起一种联系,即通过i_pointer能知道能知道i的地址,从而找到变量的地址,从而找到变量i的内存单元的内存单元2022年2月12日16时32分由于通过地址能找到所需的变量单元,因由于通过地址能找到所需的变量单元,因此说,地址指向该变量单元此说,地址指向该变量
6、单元将地址形象化地称为将地址形象化地称为“指针指针”。意思是通。意思是通过它能找到以它为地址的内存单元过它能找到以它为地址的内存单元2022年2月12日16时32分一个变量的一个变量的地址地址称为该变量的称为该变量的“指针指针”例如,地址例如,地址2000是变量的指针是变量的指针如果有一个变量专门用来存放另一变量的如果有一个变量专门用来存放另一变量的地址(即指针),则它称为地址(即指针),则它称为“指针变量指针变量”i_pointer就是一个指针变量。指针变量就是一个指针变量。指针变量就是地址变量,用来存放地址的变量,指就是地址变量,用来存放地址的变量,指針变量的值是地址(即指针)針变量的值是
7、地址(即指针)2022年2月12日16时32分“指针指针”和和“指针变量指针变量”是是不同的不同的概念概念可以说变量可以说变量i的指针是的指针是2000,而不能说,而不能说i的的指针变量是指针变量是2000指针是一个地址,而指针变量是存放地址指针是一个地址,而指针变量是存放地址的变量的变量2022年2月12日16时32分2022年2月12日16时32分3变量i2000指针i_pointer*i_pointeri*i_pointer&ii_pointeri=3;*i_pointer=3定义指针变量的一般形式为:定义指针变量的一般形式为: 类型类型 * 指针变量名指针变量名;如:如:int
8、 *pointer_1, *pointer_2;uint是是为为指针变量指定的指针变量指定的“基类型基类型”u基类型指定指针变量可指向的变量类型基类型指定指针变量可指向的变量类型u如如pointer_1可以指向整型变量,但不能指可以指向整型变量,但不能指向浮点型变量向浮点型变量2022年2月12日16时32分下面都是合法的定义下面都是合法的定义和初始化和初始化:float *pointer_3;char *pointer_4;int a,b;int *pointer_1=&a,*pointer_2=&b;*pointer_1&a; 错误错误pointer_3&a
9、; 错误错误pointer_1&a; 正确正确pointer_32000; 错误错误2022年2月12日16时32分给给指针变量指针变量赋值赋值,可以通过三种方式可以通过三种方式:u用求地址运算符用求地址运算符“&”给指针变量赋值。如:给指针变量赋值。如:p=&a;u通过通过指针变量指针变量获得地址。获得地址。如如有有 p=&a; q=p; 则此时指针变量则此时指针变量q中也存放了变量中也存放了变量a的地址的地址u通过标准库函数通过标准库函数malloc、calloc获得地址,获得地址,见第见第13章章使使p指向指向aq也指向也指向p所指的地址所指的地址2022
10、年2月12日16时32分例例8.1 通通过指针变量访问整型变量。过指针变量访问整型变量。解题思路:先定义解题思路:先定义2个整型变量,再定个整型变量,再定义义2个指针变量,分别指向这两个整型个指针变量,分别指向这两个整型变量,通过访问指针变量,可以找到它变量,通过访问指针变量,可以找到它们所指向的变量,从而得到这些变量的们所指向的变量,从而得到这些变量的值。值。2022年2月12日16时32分#include int main() int a=100,b=10; int *pointer_1, *pointer_2; pointer_1=&a; pointer_2=&b; pr
11、intf(“a=%d,b=%dn”,a,b); printf(“*pointer_1=%d,*pointer_2= %dn”,*pointer_1,*pointer_2); return 0;定义两个指针变量定义两个指针变量使使pointer_1指向指向a使使pointer_2指向指向b直接直接输出变量输出变量a和和b的值的值间接间接输出变量输出变量a和和b的值的值2022年2月12日16时32分#include int main() int a=100,b=10; int *pointer_1, *pointer_2; pointer_1=&a; pointer_2=&b;
12、printf(“a=%d,b=%dn”,a,b); printf(“*pointer_1=%d,*pointer_2= %dn”,*pointer_1,*pointer_2); return 0;此处此处*与与类型名类型名在一起。在一起。此时共同定义指针变量此时共同定义指针变量此处此处*与指针变量一起使用。此与指针变量一起使用。此时时代表指针变量所指向的变量代表指针变量所指向的变量2022年2月12日16时32分在引用指针变量时,可能有三种情况:在引用指针变量时,可能有三种情况:u给指针变量赋值。如:给指针变量赋值。如:p=&a;u引用指针变量指向的变量引用指针变量指向的变量。如如有有
13、 p=&a; *p=1; 则执行则执行printf(“%d”,*p); 将输出将输出1u引用指针变量的值。如:引用指针变量的值。如:printf(“%o”,p);使使p指向指向a*p相当于相当于a以以八八进制输进制输出出a的地址的地址2022年2月12日16时32分要熟练掌握两个有关的运算符:要熟练掌握两个有关的运算符:(1) 取地址运算符。取地址运算符。 &a是变量是变量a的地址的地址(2) * 指针运算符(指针运算符(“间接访问间接访问”运算符)运算符) 如果如果: p指向变量指向变量a,则则*p就代表就代表a。 k=*p; (把把a的值的值赋给赋给k) *p=1; (把把
14、1赋给赋给a)2022年2月12日16时32分指针运算指针运算(1)指针变量加(减)一个整数指针变量加(减)一个整数例如:例如:p+,p-,p+i,p-i,p+=i,-=i等等均是指针变量加(减)一个整数。均是指针变量加(减)一个整数。将该指针变量的原值将该指针变量的原值(是一个地址是一个地址)和它指和它指向的变量所占用的存储单元的字节数相加向的变量所占用的存储单元的字节数相加(减)。(减)。 2022年2月12日16时32分指针运算指针运算(2)指针变量赋值指针变量赋值将一个变量地址赋给一个指针变量将一个变量地址赋给一个指针变量不应把一个整数赋给指针变量不应把一个整数赋给指针变量2022年2
15、月12日16时32分指针运算指针运算(3) 两个指针变量可以相减两个指针变量可以相减如果两个指针变量都指向同一个数组中的如果两个指针变量都指向同一个数组中的元素,则两个指针变量值之差是两个指针元素,则两个指针变量值之差是两个指针之间的元素个数之间的元素个数 2022年2月12日16时32分指针运算指针运算(4) 两个指针变量比较两个指针变量比较若两个指针指向同一个数组的元素,则可以若两个指针指向同一个数组的元素,则可以进行比较进行比较指向前面的元素的指针变量指向前面的元素的指针变量“小于小于”指向后指向后面元素的指针变量面元素的指针变量如果如果p1和和p2不指向同一数组则比较无意义不指向同一数
16、组则比较无意义2022年2月12日16时32分指针运算指针运算(5) 指针变量可以有空值,即该指针变量不指针变量可以有空值,即该指针变量不指向任何变量,可以这样表示:指向任何变量,可以这样表示: p=NULL; 2022年2月12日16时32分 例例8.2 输入输入a和和b两个整数,按先大后小的两个整数,按先大后小的顺序输出顺序输出a和和b。解题思路:用指针方法来处理这个问题。解题思路:用指针方法来处理这个问题。不交换整型变量的值,而是交换两个指针不交换整型变量的值,而是交换两个指针变量的值。变量的值。2022年2月12日16时32分#include int main() int *p1,*p
17、2,*p,a,b; printf(“integer numbers:); scanf(“%d,%d”,&a,&b); p1=&a; p2=&b; if(ab) p=p1; p1=p2; p2=p; printf(“a=%d,b=%dn”,a,b); printf(“%d,%dn”,*p1,*p2); return 0;abp1p2p59&a&b成立成立2022年2月12日16时32分#include int main() int *p1,*p2,*p,a,b; printf(“integer numbers:); scanf(“%d,%d”,&a
18、mp;a,&b); p1=&a; p2=&b; if(ab) p=p1; p1=p2; p2=p; printf(“a=%d,b=%dn”,a,b); printf(“%d,%dn”,*p1,*p2); return 0;abp1p2p59&a&b&b&a2022年2月12日16时32分#include int main() int *p1,*p2,*p,a,b; printf(“integer numbers:); scanf(“%d,%d”,&a,&b); p1=&a; p2=&b; if(ab) p=
19、p1; p1=p2; p2=p; printf(“a=%d,b=%dn”,a,b); printf(“%d,%dn”,*p1,*p2); return 0;abp1p2p59&a&b&b&a2022年2月12日16时32分#include int main() int *p1,*p2,*p,a,b; printf(“integer numbers:); scanf(“%d,%d”,&a,&b); p1=&a; p2=&b; if(ab) p=p1; p1=p2; p2=p; printf(“a=%d,b=%dn”,a,b); pr
20、intf(“%d,%dn”,*p1,*p2); return 0;abp1p2p59&a&b&b&a可否改为可否改为p1=&b; p2=&a;?2022年2月12日16时32分注意注意:ua和和b的值并未交换,它们仍保持原值的值并未交换,它们仍保持原值u但但p1和和p2的值改变了。的值改变了。p1的值原为的值原为&a,后,后来变成来变成&b,p2原值为原值为&b,后来变成,后来变成&au这样在输出这样在输出*p1和和*p2时,实际上是输出变时,实际上是输出变量量b和和a的值,所以先输出的值,所以先输出9,然后输出,
21、然后输出52022年2月12日16时32分 例例8.3 题目要求同例题目要求同例8.2,即对输入的两,即对输入的两个整数按大小顺序输出。现用函数处理,而个整数按大小顺序输出。现用函数处理,而且用指针类型的数据作函数参数。且用指针类型的数据作函数参数。解题思路:定义一个函数解题思路:定义一个函数swap,将指向两,将指向两个整型变量的指针变量作为实参传递给个整型变量的指针变量作为实参传递给swap函数的形参指针变量,在函数中通过函数的形参指针变量,在函数中通过指针实现交换两个变量的值。指针实现交换两个变量的值。2022年2月12日16时32分#include int main()void swa
22、p(int *p1,int *p2); int a,b; int*pointer_1,*pointer_2; printf(please enter a and b:); scanf(“%d,%d”,&a,&b); pointer_1=&a; pointer_2=&b; if (ab) swap(pointer_1,pointer_2); printf(“max=%d,min=%dn”,a,b); return 0; abpointer_159&a&bpointer_22022年2月12日16时32分void swap(int *p1,int *
23、p2) int temp; temp=*p1; *p1=*p2; *p2=temp;abpointer_159&a&bpointer_2p1&ap2&b952022年2月12日16时32分void swap(int *p1,int *p2) int temp; temp=*p1; *p1=*p2; *p2=temp;void swap(int *p1,int *p2) int *temp; *temp=*p1; *p1=*p2; *p2=*temp;错!错!无确定的指向无确定的指向2022年2月12日16时32分#include int main() if (a
24、b) swap(a,b); printf(“max=%d,min=%dn”,a,b); return 0; void swap(int x,int y) int temp; temp=x; x=y; y=temp; 错!错!无法交换无法交换a,bab59xy59952022年2月12日16时32分如果想通过函数调用得到个要改变的值如果想通过函数调用得到个要改变的值: 在主调函数中设个变量,用个指针变量指在主调函数中设个变量,用个指针变量指向它们向它们 设计一个函数,有设计一个函数,有n个指针形参。在这个函数个指针形参。在这个函数中改变这个形参的值中改变这个形参的值 在主调函数中调用这个函数,在
25、调用时将这在主调函数中调用这个函数,在调用时将这n个指针变量作实参,将它们的地址传给该函数个指针变量作实参,将它们的地址传给该函数的形参的形参 在执行该函数的过程中,通过形参指针变量,在执行该函数的过程中,通过形参指针变量,改变它们所指向的个变量的值改变它们所指向的个变量的值主调函数中就可以使用这些改变了值的变量主调函数中就可以使用这些改变了值的变量2022年2月12日16时32分例例8.4 对输入的两个整数按大小顺序输出。对输入的两个整数按大小顺序输出。解题思路:尝试调用解题思路:尝试调用swap函数来实现题函数来实现题目要求。在函数中改变形参目要求。在函数中改变形参(指针变量指针变量)的的
26、值,希望能由此改变实参值,希望能由此改变实参(指针变量指针变量)的值的值2022年2月12日16时32分#include int main() void swap(int *p1,int *p2); int a,b; int*pointer_1,*pointer_2; scanf(%d,%d,&a,&b); pointer_1=&a; pointer_2=&b; if (ab) swap(pointer_1,pointer_2); printf(max=%d,min=%dn,a,b); return 0; void swap(int *p1,int *p2) i
27、nt *p; p=p1; p1=p2; p2=p;错!错!只交换形参指向只交换形参指向2022年2月12日16时32分注意:函数的调用可以(而且只可以)得注意:函数的调用可以(而且只可以)得到一个到一个返回值返回值(即函数值),而使用指针(即函数值),而使用指针变量作参数,可以得到多个变化了的值。变量作参数,可以得到多个变化了的值。如果不用指针变量是难以做到这一点的。如果不用指针变量是难以做到这一点的。要善于利用指针法。要善于利用指针法。2022年2月12日16时32分 例例8.5 输入输入3个整数个整数a,b,c,要求按由大,要求按由大到小的顺序将它们输出。用函数实现。到小的顺序将它们输出。
28、用函数实现。解题思路:采用例解题思路:采用例8.3的方法在函数中改的方法在函数中改变这变这3个变量的值。用个变量的值。用swap函数交换两函数交换两个变量的值,用个变量的值,用exchange函数改变这函数改变这3个变量的值。个变量的值。2022年2月12日16时32分#include int main() void exchange(int *q1, int *q2, int *q3); int a,b,c,*p1,*p2,*p3; scanf(%d,%d,%d,&a,&b,&c); p1=&a;p2=&b;p3=&c; exchange(p1
29、,p2,p3); printf(“%d,%d,%dn,a,b,c); return 0;调用结束后不会调用结束后不会改变指针的指向改变指针的指向2022年2月12日16时32分void exchange(int *q1, int *q2, int *q3) void swap(int *pt1, int *pt2); if(*q1*q2) swap(q1,q2); if(*q1*q3) swap(q1,q3); if(*q2*q3) swap(q2,q3); void swap(int *pt1, int *pt2) int temp; temp=*pt1; *pt1=*pt2; *pt2=t
30、emp; 交换指针指交换指针指向的变量值向的变量值2022年2月12日16时32分 1.首先要准确地弄清楚指针的含义。指针首先要准确地弄清楚指针的含义。指针就是地址,凡是出现就是地址,凡是出现“指针指针”的地方,都的地方,都可以用可以用“地址地址”代替,例如,变量的指针代替,例如,变量的指针就是变量的地址,指针变量就是地址变量就是变量的地址,指针变量就是地址变量要区别指针和指针变量。指针就是地址本要区别指针和指针变量。指针就是地址本身,而指针变量是用来存放地址的变量。身,而指针变量是用来存放地址的变量。2022年2月12日16时32分 2. 什么叫什么叫“指向指向”?地址就意味着指向,?地址就
31、意味着指向,因为通过地址能找到具有该地址的对象。因为通过地址能找到具有该地址的对象。对于指针变量来说,把谁的地址存放在指对于指针变量来说,把谁的地址存放在指针变量中,就说此指针变量指向谁。但应针变量中,就说此指针变量指向谁。但应注意:只有与指针变量的基类型相同的数注意:只有与指针变量的基类型相同的数据的地址才能存放在相应的指针变量中。据的地址才能存放在相应的指针变量中。2022年2月12日16时32分 void *指针是一种特殊的指针,不指向任指针是一种特殊的指针,不指向任何类型的数据,如果需要用此地址指向某何类型的数据,如果需要用此地址指向某类型的数据,应先对地址进行类型转换。类型的数据,应
32、先对地址进行类型转换。可以在程序中进行显式的类型转换,也可可以在程序中进行显式的类型转换,也可以由编译系统自动进行隐式转换。无论用以由编译系统自动进行隐式转换。无论用哪种转换,读者必须了解要进行类型转换哪种转换,读者必须了解要进行类型转换2022年2月12日16时32分以下关于地址和指针的叙述中正确的是以下关于地址和指针的叙述中正确的是( )A 可以取变量的地址赋值给同类型的指针变量可以取变量的地址赋值给同类型的指针变量B 可以取常量的地址赋值给同类型的指针变量可以取常量的地址赋值给同类型的指针变量C 可以取一个指针变量的地址赋给本指针变量,这样就使可以取一个指针变量的地址赋给本指针变量,这样
33、就使得指针变量指向自身得指针变量指向自身D 所有指针变量如果未赋初值,则自动赋空值所有指针变量如果未赋初值,则自动赋空值NULL参考参考答案:答案:A【解析】在计算机内存中,用一个字节表示一个内存单元并为每一【解析】在计算机内存中,用一个字节表示一个内存单元并为每一个存储单元编号,这个编号就是存储单元的个存储单元编号,这个编号就是存储单元的地址地址。一个变量的地。一个变量的地址称为该变量的址称为该变量的指针指针。专门用来存放变量地址的变量,称为。专门用来存放变量地址的变量,称为指针指针变量变量。A选项正确。常量存储在编译文件中,不能取地址。选项正确。常量存储在编译文件中,不能取地址。B选项选项
34、错误。一个指针变量的地址只能赋给指向这种类型的指针变量,与错误。一个指针变量的地址只能赋给指向这种类型的指针变量,与其本身类型不同,不能赋值,其本身类型不同,不能赋值,C选项错误。未赋初值的指针变量自选项错误。未赋初值的指针变量自动赋任意地址值,动赋任意地址值,D选项错误。选项错误。2022年2月12日16时32分以下关于指针的叙述正确的是以下关于指针的叙述正确的是( )A 所有类型的指针变量所占内存的大小是一样的所有类型的指针变量所占内存的大小是一样的B 指针变量所占内存的大小与其类型有关,指针变量所占内存的大小与其类型有关,char型指针变量只型指针变量只占占1个字节,个字节,double
35、型指针变量占型指针变量占8个字节个字节C 指针变量可直接指向任何类型的变量,而不会出现编译或运指针变量可直接指向任何类型的变量,而不会出现编译或运行错误行错误D 指针变量既可以直接指向结构体,也可直接指向结构体中某指针变量既可以直接指向结构体,也可直接指向结构体中某个成员,而不会出现编译或运行错误个成员,而不会出现编译或运行错误参考参考答案:答案:A【解析】专门用来存放变量地址的变量称为【解析】专门用来存放变量地址的变量称为指针变量指针变量,所有地址值所,所有地址值所占字节都是一样的,故指针变量所占内存大小一样,占字节都是一样的,故指针变量所占内存大小一样,A选项正确,选项正确,B选项选项错误
36、。由于一个变量的地址(指针)还隐含有这个变量的类型信息,所错误。由于一个变量的地址(指针)还隐含有这个变量的类型信息,所以不能随意把一个地址存放到任何一个指针变量中去,只能把具有相同以不能随意把一个地址存放到任何一个指针变量中去,只能把具有相同类型的变量的地址,存放到这个指针变量中,结构体变量与某个成员类类型的变量的地址,存放到这个指针变量中,结构体变量与某个成员类型不同,不能用同样的指针指向它们,型不同,不能用同样的指针指向它们,C、D选项错误。选项错误。2022年2月12日16时32分以下叙述中正确的是以下叙述中正确的是( )A 如果如果p是指针变量,则是指针变量,则&p是不合法的
37、表达式是不合法的表达式B 如果如果p是指针变量,则是指针变量,则*p表示变量表示变量p的地址值的地址值C 在对指针进行加、减算术运算时,数字在对指针进行加、减算术运算时,数字1表示表示1个存储单元的长度个存储单元的长度D 如果如果p是指针变量,则是指针变量,则*p+1和和*(p+1)的效果是的效果是一样的一样的参考参考答案:答案:C【解析】【解析】B选项中,如果选项中,如果p是指针变量,则是指针变量,则*p表示变量表示变量p所指向的地址的值;所指向的地址的值;A选项中,如果选项中,如果p是指针变量,则是指针变量,则&p表示变量表示变量p的地址;的地址;D选项中,如果选项中,如果p是指针
38、变量,是指针变量,*p+1表示将表示将p所指的值加上所指的值加上1,而,而*(p+1)表示的是先将指表示的是先将指针右移一位再取所指向变量的值。因此针右移一位再取所指向变量的值。因此C选项正确。选项正确。2022年2月12日16时32分以下叙述中正确的是以下叙述中正确的是( )A 基类型不同的指针变量可以相互混用基类型不同的指针变量可以相互混用B 函数的类型不能是指针类型函数的类型不能是指针类型C 函数的形参类型不能是指针类型函数的形参类型不能是指针类型D 设有指针变量为设有指针变量为 double *p,则,则 p+1 将指针将指针p移动移动8个字节个字节参考参考答案:答案:D【解析】【解析
39、】B选项中,所谓函数类型是指函数返回值的类型。选项中,所谓函数类型是指函数返回值的类型。在在C语言中允许一个函数的返回值是一个指针语言中允许一个函数的返回值是一个指针(即地址即地址),这,这种返回指针值的函数称为指针型函数;种返回指针值的函数称为指针型函数;C选项中,函数的参选项中,函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针数不仅可以是整型、实型、字符型等数据,还可以是指针类型;类型;A选项中,虽然不同基类型的指针变量占用字节数是选项中,虽然不同基类型的指针变量占用字节数是相同的相同的,但是不能混用。因此但是不能混用。因此D选项正确。选项正确。2022年2月12日16时32分以
40、下叙述中正确的是以下叙述中正确的是( )A int* p1; int * p2; int *p3;都是合法的定义指都是合法的定义指针变量的语句针变量的语句B 指针变量只能通过求地址运算符指针变量只能通过求地址运算符(&)来获得地来获得地址值址值C 语句语句p=NULL;与与p=0;是等价的语句是等价的语句D 语句语句p=NULL;执行后,指针执行后,指针p指向地址为指向地址为0的的存储单元存储单元参考答案:参考答案:A【解析】【解析】B选项描述不正确,指针变量可以通过求地址选项描述不正确,指针变量可以通过求地址运算符运算符(&)来获得地址值,可以通过指针变量获得地址值,来获得地
41、址值,可以通过指针变量获得地址值,还可以通过标准函数获得地址值;还可以通过标准函数获得地址值;C选项中,选项中,p=NULL;和和p=0;或;或p=0;等价;等价;D选项中,语句选项中,语句p=NULL;执行执行后,指针后,指针p并不是指向地址为并不是指向地址为0的存储单元,而是具有一的存储单元,而是具有一个确定的值个确定的值-空空。因此。因此A选项正确。选项正确。2022年2月12日16时32分以下叙述中正确的是以下叙述中正确的是( )A 即使不进行强制类型转换,在进行指针赋值运即使不进行强制类型转换,在进行指针赋值运算时,指针变量的基类型也可以不同算时,指针变量的基类型也可以不同B 如果企
42、图通过一个空指针来访问一个存储单元,如果企图通过一个空指针来访问一个存储单元,将会得到一个出错信息将会得到一个出错信息C 设变量设变量p是一个指针变量,则语句是一个指针变量,则语句p=0;是非法是非法的,应该使用的,应该使用p=NULL;D 指针变量之间不能用关系运算符进行指针变量之间不能用关系运算符进行比较比较参考答案:参考答案:B【解析】【解析】A选项描述不正确,指针变量的赋值只能赋予地选项描述不正确,指针变量的赋值只能赋予地址,址, 决不能赋予任何其它数据,否则将引起错误;决不能赋予任何其它数据,否则将引起错误;C选选项中,项中,p=NULL;和;和p=0;是等价的;是等价的;D选项中,
43、指向同选项中,指向同一数组的两指针变量进行关系运算可表示它们所值数组一数组的两指针变量进行关系运算可表示它们所值数组元素之间的关系。因此元素之间的关系。因此B选项正确。选项正确。2022年2月12日16时32分若在定义语句:若在定义语句:int a,b,c,*p=&c;接着执行以下选项中的语句,则能正确执行的语句是接着执行以下选项中的语句,则能正确执行的语句是( )A scanf(%d,a,b,c);B scanf(%d%d%d,a,b,c);C scanf(%d,p);D scanf(%d,&p);参考答案:参考答案:C【解析】本题重点考察的知识点是标准输入函数【解析】本题重
44、点考察的知识点是标准输入函数scanf()。scanf()函数要求,除了第函数要求,除了第1个参数为格式化字符串以外,其个参数为格式化字符串以外,其余参数均为相应变量的地址值。本题中,只有余参数均为相应变量的地址值。本题中,只有p是地址值,是地址值,因此因此C选项正确。选项正确。2022年2月12日16时32分若有以下程序若有以下程序#include int k=7,m=5;void f(int *s) int *t=&k;s=&t; *s=&m; printf(%d,%d,%d, k, *t, *s); main() int i=3,*p=&i, *r = &
45、amp;p; f(r);printf(%d,%d,%dn, i, *p, *r); 则程序的输出结果是则程序的输出结果是( )A 7,5,7,3,5,7,B 7,5,7,3,3,3,C 7,5,5,3,3,3,D 7,7,5,3,3,3,参考答案:参考答案:C【解析】在主函数中首先初始化整型变量【解析】在主函数中首先初始化整型变量i,将将i的地址赋给指针的地址赋给指针变量变量p,再将指针变量再将指针变量p的地址赋给指向指针的指针变量的地址赋给指向指针的指针变量r;调用调用f函函数数,将变量将变量r的值传递给变量的值传递给变量s;由于由于k和和m分别赋值分别赋值7和和5,printf(%d,%d,%d, k, *t, *s);,即结果为,即结果为7,5,5;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 药用甘草项目营销计划书
- 肚脐穿孔器械项目运营指导方案
- 空贵金属制粉饼盒细分市场深度研究报告
- 自行车曲柄市场发展前景分析及供需格局研究预测报告
- 医用抗真菌霜产品供应链分析
- 成比例的模型车产品供应链分析
- 尿素合成塔产业链招商引资的调研报告
- 家用电净水器产品供应链分析
- 牛奶均质机项目营销计划书
- 冰球守门员用保护垫产品供应链分析
- 消毒产品人员岗位责任制度
- 袁隆平的英文简介课件
- 泥石流治理工程施工方案
- LY/T 2586-2016空气负(氧)离子浓度观测技术规范
- GB/T 6723-2008通用冷弯开口型钢尺寸、外形、重量及允许偏差
- GB/T 25216-2010煤与瓦斯突出危险性区域预测方法
- 高原疾病防治知识培训课件
- 玉米高产高效生产技术全套课件
- 胜达因高速泵介绍课件
- 监理通风与空调质量评估报告
- 挤压造粒机组培训课件
评论
0/150
提交评论