运行以下代码片段的行为是( )。
int x = 101;
int y = 201;
int *p = &x;
int *q = &y;
p = q;这题考指针赋值。拿到题先分清p和q各自存的是地址还是数值,再看p=q这行到底改的是谁存的地址。别被变量名字带数字迷惑,指针只存地址,不存值。
最容易错在把指针赋值当成值拷贝,以为p=q会把y的值201赋给x,或者以为q也会跟着变。还有学生看到代码里有x=101、y=201,下意识想选A或B,其实那两行只是初始化,后面根本没碰过x或y的值。指针变量本身存的是地址,指针赋值只是把另一个指针存的地址拷过来,不改变任何变量的值。
考点与概念 这题考查指针与引用的核心机制:指针变量存的是地址,指针赋值是改变指针变量里存的地址,而不是改变它指向的变量的值。初学者常混淆“指针赋值(p=q)”和“值拷贝(*p=*q)”,前者改的是指针本身,后者改的是指针指向的内容。
命题视角 命题人爱在这里挖坑:用看似有数字的变量名(x=101、y=201)诱导学生选A或B,实际考的是对指针赋值本质的理解。这种题在GESP四级、五级、六级以及CSP入门级、NOIP初赛都高频出现,属于基础但易错点。
逐步推演 1. int x = 101; int y = 201; 初始化两个整型变量,x存101,y存201。 2. int *p = &x; p是整型指针,初始存x的地址,所以p指向x,*p=101。 3. int *q = &y; q存y的地址,q指向y,*q=201。 4. p = q; 这行把q里存的地址(即y的地址)拷贝给p。p现在存y的地址,p指向y,但x的值仍是101,y的值仍是201,没有任何数值被修改。
选项辨析
避坑提醒 记住:指针变量存地址,指针赋值改地址,不碰值。想改值必须解引用,写*p=*q才把y的值拷给x。题目里只有p=q,所以只改p的指向。
考频与趋势 指针与引用在题库共考过99题,覆盖8个考试级别(2007-2026)。逐年分布:2007年1题、2015年1题、2017年1题、2022年1题、2023年16题、2024年20题、2025年25题、2026年20题、null年14题。分赛事:GESP四级24题、GESP五级22题、GESP七级18题、GESP六级16题、CSP入门级13题、GESP八级3题、NOIP普及组初赛2题、NOIP提高组初赛1题。从数据看,2023-2026年指针类题目数量明显上升,尤其是GESP五级、六级和CSP入门级,说明该考点在入门阶段被反复强化,未来仍会保持较高频率。
预测 基于现有考频趋势,指针与引用在GESP五级、六级以及CSP入门级、NOIP初赛中的考查比例将继续上升。命题人可能会在更复杂的程序中嵌入类似的指针赋值陷阱,例如多步指针操作、数组指针与元素指针混用等,但核心仍是区分“改指针”与“改值”。暂无足够依据预测具体题型变化,但可预期该知识点仍是入门级必考内容。