我在下面列出了整个代码,但我唯一想知道的是setBit
函数。 x = 1 << bitNum
只会移动0001,但左边有多个空格,具体取决于bitNum
的数字,但我不明白最后一行(*u |= x)
为什么在这里使用指针?
#include <stdio.h>
typedef unsigned int uint;
int checkBit(uint u, uint bitNum);
void setBit(uint* u, uint bitNum);
int countOnes(uint u);
int main()
{
uint xxx, bitNumber;
printf("\n Enter decimal integer xxx: ");
scanf("%u", &xxx);
printf("\n xxx in decimal: %u", xxx);
printf("\n xxx in hex: %x", xxx);
////// Test countOnes function /////////////
printf("\n Number of ones in xxx: %d", countOnes(xxx));
////// Test checkBit function /////////////
printf("\n Enter bit to check: ");
scanf("%u", &bitNumber);
printf("\n Bit %d is %d", bitNumber, checkBit(xxx, bitNumber));
printf("\n Enter bit to check: ");
scanf("%u", &bitNumber);
printf("\n Bit %d is %d", bitNumber, checkBit(xxx, bitNumber));
////// Test setBit function /////////////
printf("\n Enter bit to set: ");
scanf("%u", &bitNumber);
printf("\n Setting bit %d of xxx", bitNumber);
setBit(&xxx, bitNumber);
printf("\n xxx in hex: %x", xxx);
printf("\n");
return 0;
}
int countOnes(uint u)
{
int bitCount;
for(bitCount = 0; u; u = u >> 1)
{
bitCount += u & 1;
}
return bitCount;
}
void setBit(uint* u, uint bitNum)
{
int x;
x = 1 << bitNum;
*u |= x;
}
int checkBit(uint u, uint bitNum)
{
int x = u >> bitNum;
if(x & 1 == 1)
return 1;
else
return 0;
}
答案 0 :(得分:2)
*u |= x;
上面的行或者使用位掩码x来指示u指向的整数。
as setBit()接收指向integer(uint * u)的指针。要更改该整数,您必须将其称为* u
答案 1 :(得分:1)
为什么在这里使用指针?
如果没有指针参数,对所需变量的更改将不会反映在main()
中。
仅供参考,C
在参数传递中使用传值。因此,您需要传递变量的地址并在指针中收集它,以便将更改反映到main()
中的实际变量。
根据代码逻辑,您收到的参数为uint* u
。因此,要对指针所持地址的值进行操作,需要取消引用运算符*
。实际上
*u |= x;
表现得像
(*u) |= x;
因为operator precedence,基本上是在告诉
&#34;获取u指向的地址的值,并将其与x中的值一起使用,并将其存储到u&#34;
指向的地址中答案 2 :(得分:0)
(* u | = x)。为什么在这里使用指针?
在上面的语句中,u
是指针,但是当您将指向*
之前的间接操作符u
放在*u
之前时,您就是取消引用指针检索值指向的指针。
答案 3 :(得分:0)
指针很可能用于减少重复。替代方案是:
uint setBit (uint u, uint bitNum)
xxx = setBit (xxx, bitNumber);
如果你只是用它来设置一个位,那么指针就不必指定变量的名称两次。此外,它还避免了意外创建无效的代码的可能性,如下所示:
setBit (xxx, bitNumber);
由于忽略了返回值,因此根本不执行任何操作。使用指针的功能,这个错误是不可能的。