指针题目分析详解(作业一)

一.填空

1.假定p 所指对象的值为28p+1 所指对象的值为62,则*p++的值为___28__*++p的值为___62__

分析:由于后置自加运算符优先级高于指针运算符,而前置自加运算符与指针运算符在同一优先级(从右到左),则*p++所指对象的值为28(遵循后置自加运算符的先用再加的原则),而*++p所指对象为62(由于两运算符在同一优先级,且该优先级的结合性是从右到左,则p先与++前置自加运算符)结合,其值变成了原对象后一对象的地址,再与*(指针运算符)结合)。

2假定p 所指对象的值为25p+1 所指对象的值为50,则执行“(*p)++”语句后,p 所指对象的值为__26___

分析:由于括号运算符位于第一优先级,高于指针运算符,而在括号内的内容当作一个整体,易得出执行(*p)++时,p先与*结合,代表其所指对象的值25,而后与++(后置自加运算符)时其值不变,执行后其值自加变成了26。

小结:注意此类题目的字眼,“执行时”与“执行后”的结果可能不同!

3假定p 所指对象的值为25p+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) Bfunc(&xy) Cfunc(&x&y)Dfunc(xy)

分析:参数列表中的double *pd,int &ri分别表示指针和引用,需要将指针元素传址给第一个参数,将引用元素传值给第二个参数。

4char *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            ;

}



你可能感兴趣的:(指针题目分析详解(作业一))