C 程序的输出 |第 31 组(指针)
先决条件: C/C++ 中的指针
- 问题 1
输出会是什么?#include
int main() { int a[] = { 1, 2, 3, 4, 5} ; int *ptr; ptr = a; printf(" %d ", *( ptr + 1) ); return 0; } 输出
2
描述:
可以将数组分配给指针。所以,当 ptr = a;执行时,元素 a[0] 的地址被分配给 ptr,*ptr 给出元素 a[0] 的值。当 *(ptr + n) 被执行时,数组中第 n 个位置的值被访问。 - 问题2
输出会是什么?#include
int main() { int a = 5; int *ptr ; ptr = &a; *ptr = *ptr * 3; printf("%d", a); return 0; } 输出:
15
描述:
ptr = &a;复制 ptr 中 a 的地址,使 *ptr = a 和语句 *ptr = *ptr * 3;可以写成 a = a * 3;使a为 15。 - 问题2
输出会是什么?#include
int main() { int i = 6, *j, k; j = &i; printf("%d\n", i * *j * i + *j); return 0; } 输出:
222
描述:
根据 BODMAS 规则,乘法具有更高的优先级。在表达式 i * *j * i + *j; 中,将首先计算 i * *j *i 并给出结果 216,然后加上 *j,即 i = 6,输出变为 222。 - 问题 4
输出会是什么?#include
int main() { int x = 20, *y, *z; // Assume address of x is 500 and // integer is 4 byte size y = &x; z = y; *y++; *z++; x++; printf("x = %d, y = %d, z = %d \n", x, y, z); return 0; } 输出:
x=21 y=504 z=504
描述:
一开始,x 的地址分配给 y,然后 y 分配给 z,这使得 y 和 z 相似。当指针变量递增时,值与变量的大小相加,在这种情况下,y 和 z 递增 4。 - 问题 5
输出会是什么?#include
int main() { int x = 10; int *y, **z; y = &x; z = &y; printf("x = %d, y = %d, z = %d\n", x, *y, **z); return 0; } 输出:
x=10 y=10 z=10
描述:
*y 是指针变量,而 **z 是指向指针变量的指针。 *y 给出它持有的地址处的值并且 **z 搜索两次,即,它首先获取它持有的地址处的值,然后给出该地址处的值。