C语言 破译函数参数时遇到问题:指针和指向指针的指针



我正在尝试使用一个旨在替换 C 中的 scanf() 的函数。该函数由第三方编写,并据此定义:

ScanDecimal16uNumber - 扫描十进制 16 位无符号数字 ANSIC 原型:字节 ScanDecimal16uNumber(const unsigned char **str, word *val)

str:byte - 要扫描的字符串,以 0x 开头。它也会返回,直到扫描到的位置

val:指向单词的指针 - 指向值的指针

返回值:字节 - 错误代码"

我遇到的麻烦是两个输入。在与比我更精通 C 的人交谈后,我想我已经掌握了第二个输入。*val 是我尝试获取的值(16 位十进制数),val 是它的地址。我对单词如何过渡到 int 有点模糊,这是我所需要的,但感觉很舒服。

第一个输入确实给我带来了麻烦,无论是语法还是它的作用。首先,什么是**?是地址到地址?什么?如果不首先建立地址本身,怎么能有一个地址到一个地址?这样的事情的声明会是什么样子?

非常感谢一些关于函数和语法的建议。我正在重新熟悉C,这感觉有点像深渊。

提前感谢,尤西夫·努里扎德

更新 1.0:我根据您的建议修改了代码,目前没有错误,只有三个警告(最好的!我正在发布下面的代码:

  const unsigned char *addressPrime                 = "0x1f307100"; 
  const unsigned char *addressOfAddressPrime        = addressPrime; 
  word                dutyCycle;                                

  PWM1_Enable();
  UTIL1_ScanDecimal16uNumber(&addressPrime, &dutyCycle);
  PWM1_SetRatio16(dutyCycle);

此代码用于飞思卡尔FRDM KE02Z板,您看到的新功能用于控制PWM占空比,其值与我从实用程序扫描中获得的值相同。我收到的警告是:

  1. 地址Prime的声明中,"初始化中的指针目标在符号上有所不同。

2/3. 未使用的变量 DeviceDataPrv/rtval,它们是 PWM 函数的一部分,我现在不太担心。

在这一点上,我的问题是:

  1. 他们所指的签名是什么?
  2. 应该更多地关注我选择的号码还是0x1f307100有效?
  3. 由于这是为了动态更新PWM占空比,我是否应该为扫描功能使用while环路?

下面介绍如何调用函数并使用它在两个参数中返回的结果。

int main(void) {
  const unsigned char *input = "0x1f30 0x7100";
  const unsigned char *p = input;
  word val1, val2;  /* A word should be the same as a uint16_t. */
  byte r = ScanDecimal16uNumber(&p, &val1);
  /* p should now point at the space between the two numbers in the
   *input string.  This will allow you to scan the next number immediately. */
  byte q = ScanDecimal16uNumber(&p, &val2);
  printf("%d %dn", val1, val2);
  return 0;
}

在 C 中,字符串被定义为"char *"(指向字符的指针)。 所以'char **'实际上可以被认为是字符串的地址。 你可以这样称呼它:

char *strg = "This is my String";
word aword;
ScanDecimal16uNumber(&strg, &aword);

这使用 &(地址)运算符来发送值的地址,而不是值本身。 这有帮助吗?

相关内容

  • 没有找到相关文章

最新更新