C++ 程序的输出 |第 38 组(指针)
先决条件:C/C++ 中的指针
问题 1 以下 C++ 程序会打印什么?
C++
#include
using namespace std;
int main()
{
int x[5] = { 1, 2, 3, 4, 5 };
// p points to array x
int* p = x;
int i;
// exchange values using pointer
for (i = 0; i < 2; i++) {
int temp = *(p + i);
*(p + i) = *(p + 4 - i);
*(p + 4 - i) = temp;
}
// output the array x
for (i = 0; i < 5; i++)
cout << x[i] << " ";
return 0;
}
C++
#include
void fun(int x)
{
x = 30;
}
int main()
{
int y = 20;
fun(y);
printf("%d", y);
return 0;
}
C++
#include
int main()
{
int arri[] = { 1, 2, 3 };
int* ptri = arri;
char arrc[] = { 1, 2, 3 };
char* ptrc = arrc;
printf("sizeof arri[] = %d ", sizeof(arri));
printf("sizeof ptri = %d ", sizeof(ptri));
printf("sizeof arrc[] = %d ", sizeof(arrc));
printf("sizeof ptrc = %d ", sizeof(ptrc));
return 0;
}
C++
#include
using namespace std;
int* reverse(int*);
int main()
{
int x[5] = { 1, 2, 3, 4, 5 };
int i, *p;
// exchange values
p = reverse(x);
// output the array x
for (i = 0; i < 5; i++)
cout << *(p + i) << " ";
return 0;
}
int* reverse(int* p)
{
int i;
// exchange values
for (i = 0; i < 2; i++) {
int temp = *(p + i);
*(p + i) = *(p + 4 - i);
*(p + 4 - i) = temp;
}
return p;
}
C++
#include
using namespace std;
int main()
{
int x = 10, y = 15, i;
for (i = 0; i < 1; i++) {
int x = 20, y = 15;
}
int mul = x * y;
cout << x << "*" << y << " = " << mul;
return 0;
}
a) 5 4 3 2 1
b) 1 2 3 4 5
c) 元素地址
d) 不能说
Answer: a
说明: p 指向数组 x 然后在 for 循环中使用指针交换值到交换值后最后一个循环打印值
QUE.2 以下 C++ 程序会打印什么?
C++
#include
void fun(int x)
{
x = 30;
}
int main()
{
int y = 20;
fun(y);
printf("%d", y);
return 0;
}
一)10
b) 20
c) 30
d) 运行时错误
Answer: b
说明:参数在 C 中总是按值传递。因此,在上面的代码中,y 的值没有使用函数fun() 进行修改。那么我们如何在另一个函数内部修改一个函数的局部变量的值呢?指针是此类问题的解决方案。使用指针,我们可以在另一个函数内修改一个函数的局部变量。请看下一个问题。请注意,在 C 中一切都是按值传递的。我们只能使用指针来获得按引用传递的效果。
问题 3 以下 C++ 程序会打印什么?
C++
#include
int main()
{
int arri[] = { 1, 2, 3 };
int* ptri = arri;
char arrc[] = { 1, 2, 3 };
char* ptrc = arrc;
printf("sizeof arri[] = %d ", sizeof(arri));
printf("sizeof ptri = %d ", sizeof(ptri));
printf("sizeof arrc[] = %d ", sizeof(arrc));
printf("sizeof ptrc = %d ", sizeof(ptrc));
return 0;
}
a) sizeof arri[] = 3 sizeof ptri = 4 sizeof arrc[] = 3 sizeof ptrc = 4
b) sizeof arri[] = 12 sizeof ptri = 4 sizeof arrc[] = 3 sizeof ptrc = 1
c) sizeof arri[] = 3 sizeof ptri = 4 sizeof arrc[] = 3 sizeof ptrc = 1
d) sizeof arri[] = 12 sizeof ptri = 4 sizeof arrc[] = 3 sizeof ptrc = 4
Answer: d
说明:数组的大小是元素的数量乘以元素的类型,这就是为什么我们得到 sizeof arri 为 12 和 sizeof arrc 为 3 的原因。指针的大小对于编译器来说是固定的。对于编译器,所有指针类型都占用相同数量的字节。这就是我们为 ptri 和 ptrc 得到 4 的原因。
QUE.4 以下 C++ 程序的输出是什么?
C++
#include
using namespace std;
int* reverse(int*);
int main()
{
int x[5] = { 1, 2, 3, 4, 5 };
int i, *p;
// exchange values
p = reverse(x);
// output the array x
for (i = 0; i < 5; i++)
cout << *(p + i) << " ";
return 0;
}
int* reverse(int* p)
{
int i;
// exchange values
for (i = 0; i < 2; i++) {
int temp = *(p + i);
*(p + i) = *(p + 4 - i);
*(p + 4 - i) = temp;
}
return p;
}
a) 1 2 3 4 5
b) 元素的地址
c) 运行时错误
d) 没有提到的
Answer: d
解释:
p 指向数组 x 然后使用 for 循环中的指针交换值在交换值后最后一个循环打印值但在此程序中反向函数获取数组的地址和地址 p 的地址将其反向但输出不是提到输出是 5 4 3 2 1
问题 5 以下 C++ 程序的输出是什么?
C++
#include
using namespace std;
int main()
{
int x = 10, y = 15, i;
for (i = 0; i < 1; i++) {
int x = 20, y = 15;
}
int mul = x * y;
cout << x << "*" << y << " = " << mul;
return 0;
}
a) 10*15 = 150
b) 20*15 = 300
c) 15*15 = 225
d) 没有提到的
Answer: a