C++ 笔试中的指针 *p

请找出下面程序中有哪些错误:
int main()
{
   int i=10;
   int j=1;
   const int *p1;//(1)
   int const *p2=&i; //(2)
   p2=&j;//(3)
   int *const p3=&i;//(4)
   *p3=20;//(5)
   *p2=30;//(6)
   p3=&j;//(7)
return 0;
}

const int *p1;//(1):表示p1中存放的内容不能被改变,但是p1是可以被改变的,因此这句话是正常定义;
int const *p2=&i; //(2),这句画的含义是将p2指向i但是i中存放的内容是不可以被改变的,p2的指向可以被改变,因此这句话也是正常定义;
p2=&j;//(3),在上一句话已经说过了p2的指向是可以被改变的,因此这句话没有问题;
int *const p3=&i;//(4),这句话代表p3的指向不可以被改变,但是其指向内存中的内容可以被改变;
*p3=20;//(5),根据上一句话的解释(5)是正确的;
*p2=30;//(6),*p2不可以被改变所以(6)错;
p3=&j;//(7),p3是不可以被改变的(7)错。

也可以直接这样:

const int *p1; p1可变,*p1不可变
int const *p2=&j p2可变,*p2不可变

int *const p3=&i; p3不可变,*p3可变

double dArray[2] = {4, 8}, *p, *q;
p = &dArray[0];
q = p + 1;
cout << q – p << endl; 
cout << (int)q - (int)p << endl;
a) 1 and 8
b) 8 and 4
c) 4 and 8
d) 8 and 1

选 A ; 
第一个是指针加减,按照的是指向地址类型的加减,只跟类型位置有关, q 和 p 指向的数据类型以实际数据类型来算差一个位置,因此是 1 。而第二个加减是实际指针值得加减,在内存中一个 double 类型占据 8 个字节,因此是 8

猜你喜欢

转载自blog.csdn.net/single6/article/details/82257599
今日推荐