一.填空
1.假定p 所指对象的值为28,p+1 所指对象的值为62,则*p++的值为___28__;*++p的值为___62__。
分析:由于后置自加运算符优先级高于指针运算符,而前置自加运算符与指针运算符在同一优先级(从右到左),则*p++所指对象的值为28(遵循后置自加运算符的先用再加的原则),而*++p所指对象为62(由于两运算符在同一优先级,且该优先级的结合性是从右到左,则p先与++(前置自加运算符)结合,其值变成了原对象后一对象的地址,再与*(指针运算符)结合)。
2.假定p 所指对象的值为25,p+1 所指对象的值为50,则执行“(*p)++;”语句后,p 所指对象的值为__26___。
分析:由于括号运算符位于第一优先级,高于指针运算符,而在括号内的内容当作一个整体,易得出执行(*p)++时,p先与*结合,代表其所指对象的值25,而后与++(后置自加运算符)时其值不变,执行后其值自加变成了26。
小结:注意此类题目的字眼,“执行时”与“执行后”的结果可能不同!
3.假定p 所指对象的值为25,p+1 所指对象的值为50,则执行“*(p++);”语句后,p 所指对象的值为_50__。
分析:由于自加运算符的特性,在执行时,*(p++)相当于*(p),其值为25,但执行后p自加变成了p+1,实现了p变量地址的转变,其所指向的值也会相应变化,则执行后p所指对象的值为50。
4.已知int a[5]={1,2,3,4,5},*p=a,b;分别回答下列问题:
①执行b=*p++后,b= 1 ,a[0]= 1 ,*p= 2 。
②执行b=(*p)++后,b= 1 ,a[0]= 2 ,*p= 2 。
③执行b=*++p后,b= 2 ,a[0]= 1 ,*p= 2 。
分析:由于*p=a,则p所存地址为整型数组首元素地址。通过优先级的比较及其结合性以及自加自减运算符的特性,可得出:
在①中,p先与++(后置自加运算符)结合,然后与*(指针运算符)结合,将*p的值1赋给了b,而后p自加1,所指对象变为了整型数组第二个元素,故*p=2;
在②中,由于括号运算符与后置自加运算符在同一优先级,故p先与*(指针运算符)结合,代表其所指对象的值1,然后遵循第二优先级从左到右的原则结合,由于是后置优先级,则为将(*p)的值赋给b,然后*p自加1,代表整型数组首元素自加1,故a【0】=2,*p=2;
在③中,存在指针运算符(*)和前置自加运算符(++),由于两运算符优先级一致,故遵循从右向左的结合性。p先与++(前置自增运算符)结合,地址改变为原对象后一对象的地址,在与*(指针运算符)结合,则将整型数组第二个元素的值赋给b,而执行后,指针p自加,指向整型数组第二个元素2,a【0】值不变。
二.选择
1. 以下程序的输出结果是( C )。
void main()
{
int a[] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, *p = a+5;
cout<<*p;
}
A) 非法 B) a[4]的地址 C) 4 D) 5
分析:此题中(a+5)代表了数组中的a【5】的地址,即第六个元素4的地址,故*p的值为4。
2. 若已定义:int a[9],*p=a;并在以后的语句中未改变p的值,则不能表示a[1] 地址的表达式是( C )。
A) p+1 B) a+1 C) a++ D) ++p
分析:数组名所表示的数组地址不能重新被赋值。
3.已知函数func 的原形是
double func(double *pd,int &ri);
变量x 和y 的定义是double x;int y;把x 和y 分别作为第一参数和第二参数来调用函数func,正确的调用语句是( B)。
A. func(x,&y); B.func(&x,y); C.func(&x,&y);D.func(x,y);
分析:参数列表中的double *pd,int &ri分别表示指针和引用,需要将指针元素传址给第一个参数,将引用元素传值给第二个参数。
4.设char *s="\ta\017bc";则指针变量s指向的字符串所占的字节数是 C 。
A)9 B)5 C)6 D)7
分析:字节数不是;指字符串长度,字符串长度比存储字节数少一。\t 是一个转义字符 相当于键盘“Tab”键;a 普通字符;\017 转义字符 ASCII代码值为8进制数17即10进制数15的那个符号;b 普通字符;c 普通字符 ;字符串结束标志‘\0’。s是字符串类型。每一个都是char型变量;char型变量的二进制长度是8,也就是一个字节,所以指针变量s 指向的字符串所占字节数是6 ,字符串长度是5.
5.以下与库函数strcpy(char*p1,char*p2)功能不等的程序段是 D 。
A)strcpy1(char *p1,char *p2)
{while ((*p1++=*p2++)!='\0');}
B)strcpy2(char *p1,char *p2)
{while ((*p1=*p2)!='\0'){p1++;p2++;}}
C)strcpy3(char *p1,char *p2)
{while (*p1++=*p2++);}
D)strcpy4(char *p1,char *p2)
{while (*p2) *p1++=*p2++;}
分析:D选项最后的一个‘\0’符号并未赋值传递,当遇到‘\0’符号时立马停止。
三.给出程序的运行结果
1.
int main()
{ char a[80],b[80],*p="aAbcdDefgGH";
int i=0,j=0;
while (*p!='\0')
{ if (*p>='a'&&*p<='z')
{a[i]=*p;i++;}
else
{b[j]=*p;j++;}
p++;
}
a[i]=b[j]='\0';
puts(a);puts(b);
return 0;
}
输出结果: abcdefg
ADGH
分析:由于大写英文字母与小写英文字母的ASCII码不同,故可通过比较ASCII码来区分大小写字母。
2.
void main()
{
int a[8]={4,8,12,16,20,24,28,32};
int *p=a;
do
{
cout<<*p<<' ';
p+=3;
}while(p
输出结果:4 16 28
分析:考点为p=a+i,表示将某数组的a【i】元素的地址赋给指针p。3.
#include
#include
void main()
{
char *p;
int i;
p=new char[20];
strcpy(p,"ABCDE");
for(i=4;i>=0;i--)
cout<<*(p+i);
cout<=0;i--)
cout<
输出结果:
EDCBA
E
DE
CDE
BCDE
ABCDE
4.
#include
void main()
{
char s[]="ABCD",*p;
for(p=s;p
输出结果:
ABCD
BCD
CD
D
分析:此处为使用指针变量指向一个字符串。
5.
#include
void main(void)
{
char s[20] = “here is”, *s1,*s2 = “key”;
s1=s;
while (*s1!=’\0’) s1++;
while (*s1++=*s2++);
s2 = s;
while (*s2!=’\0’) s2++
cout<< s2-s;
}
输出结果:10
三.以下程序求a数组中的所有素数的和,函数isprime用来判断自变量是否为素数。
#include
int isprime(int);
void main(void)
{
int i,a[10],*p=a,sum=0;
cout<<"Enter 10 num:";
for (i=0;i<10;i++)
cin>>a[i];
for (i=0;i<10;i++)
if (isprime(*(p+ i))==1)
{
cout<<*(a+i);
sum+=*(a+i);
}
cout<<"The sum="< } int isprime(int x) { int i; for (i=2;i<=x/2;i++) if (x%i==0) return (0); return 1 ; }