麻烦解密函数参数:指针和指针指针

时间:2013-11-10 05:44:28

标签: c function pointers syntax

我正在尝试使用一个函数来替换C中的scanf()。该函数由第三方编写并相应地定义:

  

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

     

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

     

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

     

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

我遇到的麻烦是两个输入。在与比我更熟悉C的人交谈之后,我想我已经掌握了第二个输入。 * val是我想要获取的值(16位十进制数),val是其地址。我对word转换为int有点模糊,这是我需要的,但对它感觉很舒服。

第一个输入确实给我带来了麻烦,包括语法和它的作用。首先,**是什么?它是地址的地址?什么?如果没有先自己建立地址,怎么能有地址到地址呢?这样的宣言怎么样?

非常感谢功能和语法方面的一些建议。我正在重新认识C,这感觉有点像深渊。

提前致谢, Yusif Nurizade

更新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. 在addressPrime的声明中“初始化中的指针目标在签名方面有所不同。
  2. 2/3。未使用的变量DeviceDataPrv / rtval是PWM功能的一部分,我现在不太担心。

    我现在的问题是:

    1. 他们指的是什么签名?
    2. 我应该更多地关注我选择的数字还是0x1f307100工作?
    3. 由于这是为了动态更新PWM占空比,我应该使用while循环来实现扫描功能吗?

2 个答案:

答案 0 :(得分:2)

以下是如何调用该函数并使用它在两个参数中返回的结果。

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 %d\n", val1, val2);
  return 0;
}

答案 1 :(得分:0)

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

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

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