指针变量的赋值与解引用
指针变量的赋值与解引用
掌握指针类型变量的赋值、解引用。
指针赋值有两类:让指针保存某个变量的地址(p = &x;),或让两个同类型指针指向同一地址(q = p;)。解引用用 *p 访问所指对象,*p = 10 会修改原变量。
四级卷面爱考「改值后输出什么」:同一地址被多个指针共享时,通过任一指针修改都会反映到原变量。判断题也常考 & 与 * 能否抵消、对 nullptr 解引用是否合法。
int a = 3, b = 7;
int *p = &a;
*p = 5; // a 变为 5
p = &b; // p 改指 b,不再指向 a
写代码时养成习惯:解引用前先确认指针已指向有效对象。四级判断题还常问「两个指针指向同一变量时,通过其中一个修改是否影响另一个的解引用结果」——会,因为它们读写同一块内存。
运行下面代码,屏幕上输出是( )。
double* p_arr = new double [3];
p_arr[0] = 0.2;
p_arr[1] = 0.5;
p_arr[2] = 0.8;
p_arr += 1;
cout << p_arr[0] << endl;
p_arr -= 1;
delete p_arr;
运行下面代码片段后,x 和 *p 的结果分别是( )。
int x = 20;
int* p = &x;
*p = *p + 2;
原文保真说明:原卷印刷错误 1 处(照原卷保留,未作修改)
原卷印刷如此标点题干 · 第 3 行
原卷作
*p = *p + 2;,常规写法应为*p = *p + 2;原卷代码第 3 行行末是全角分号 U+FF1B(900 dpi 放大图像可见其字形与第 1、2 行的半角分号不同),照原卷转写。
执行下述代码后,变量 a 的值为( )。
int a = 10;
int* p = &a;
*p = 20;
运行下面程序后变量 a 的值是( )。
int a = 42;
int* p = &a;
*p = *p + 1;
小杨写了如下的指针接力程序,程序执行完后变量 a、*p1 和 *p2 的值分别是( )。
int a = 5;
int* p1 = &a;
int* p2 = p1;
*p2 = 10;
小杨正在调试他的温度传感器程序,其中变量 x 保存当前温度。下面这段代码运行后,变量 x 的值变成了 8。
int x = 5;
int *p = &x;
*p = *p + 3;
执行下面代码后,输出为( )。
int main() {
int a = 5;
int* p = &a;
int** q = &p;
**q += 7;
cout << a << " " << *p;
}
小杨在调试一个“等级提升”系统,代码逻辑如下,执行后 *p 的值是( )。
int lv = 5, next_lv = 6;
int *p = &lv;
*p = *p + 1;
p = &next_lv;
执行完下面代码后,变量 val 的值是( )。
int data[] = {10, 20, 30, 40, 50};
int *ptr = data + 2;
int val = *(ptr - 1) + *(ptr + 1);
运行以下程序后,变量 a 的值最终会变为 20。
void modify(int *p) {
*p = *p + 10;
}
int main() {
int a = 10;
modify(&a);
return 0;
}