为什么选b,p=&m,p指向的是m的地址,p=n,p指向的是整型变量n,为啥呢……
因为p是指针,并且指向了m,m n 是值
所以 *p 和 m,p和&m 是等价的
=是赋值,左右不能颠倒,然后采用替换,你会发现只有b可以通过替换得到 m = n
p是个指针,它指向了m的地址,&m是m的地址
*p是对p进行解地址操作,对它赋值就是将值赋给它指向的地址,从它取值就是取得指向的地址里的值
由于p=&m,所以*p就等价于m
那么看看选项
A.m=*p,现在知道*p就等价于m,那么选项A就是m=m,显然不对
B.*p等价于m,所以*p=n等价于m=n
C.m=&n,这是把n的地址赋值给m
D.这跟A一样,还是m=m
-=-=-=-=-
其实这题也可以用排除法
首先A和D里跟n一点关系都没有,所以肯定不对
C,既然问跟m=n等价的是什么,那就肯定不能是m=&n,除非n和&n是一回事
因为*p表示指针p所指向的变量的值,而p指向的变量是m,因此*p就是m。因此,将*p设置为n等价于将m设置为n
根据问题描述,我们需要解释为什么在这段代码中选择b,以及为什么p=&m使得p指向了m的地址,而p=n使得p指向了整型变量n。
首先,让我们来看一下代码段中的函数GetBits
的作用。该函数的作用是从无符号整数x的第p位开始,取n位数。
unsigned GetBits(unsigned x, int p, int n) {
return (x >> (p + 1 - n)) & ~(~0 << n);
}
在这个函数中,传入的参数有无符号整数x,起始位p,以及要取的位数n。函数的返回值是从x的第p位开始取n位数。
我们可以看到,在函数中使用了位运算来实现这个功能。具体来说,代码中的这一行
return (x >> (p + 1 - n)) & ~(~0 << n);
对x进行了如下操作: 1. x >> (p + 1 - n)
:将x右移(p + 1 - n)位,相当于将x的第p位移到最右边,然后取出n位数。 2. ~0 << n
:将0左移n位,创建一个n位的全1二进制数。 3. ~(~0 << n)
:取反操作,生成一个n位的全0二进制数。 4. (x >> (p + 1 - n)) & ~(~0 << n)
:将第1步和第3步的结果进行与运算,得到从x的第p位开始的n位数。
现在来回答问题,为什么在这段代码中选择b?
从代码中的函数定义和实现来看,并没有涉及到变量b。因此,选择b与这段代码无关,应该是问题中的错误信息。
接下来,解释为什么p=&m使得p指向了m的地址,而p=n使得p指向了整型变量n。
首先,我们需要明确一些概念。 - &
是一元操作符,取地址操作符。它返回一个指向其操作数的地址。 - 在C中,指针是一个变量,用于存储内存地址。
在这个问题中,假设变量m和n都是整型变量。
p=&m
:将变量m的地址赋值给指针变量p。这意味着p指向了m的地址。p=n
:将整型变量n的值赋值给指针变量p。这是非法的操作,因为p是一个指针变量,应该存储一个地址,而不是一个整数值。所以,答案是p=&m使得p指向了m的地址,而p=n是不合法的操作。