【问题标题】:Trouble deciphering function parameters: pointer and pointer to pointer麻烦破译函数参数:指针和指针指针
【发布时间】:2013-11-10 05:44:27
【问题描述】:

我正在尝试使用一个函数来替代 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. 在 addressPrime 的声明中“初始化中的指针目标的符号不同。

2/3。未使用的变量 DeviceDataPrv/rtval 是 PWM 功能的一部分,我现在不太担心。

此时我的问题是:

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

【问题讨论】:

  • 在函数内部,您可能会执行以下操作:unsigned char const *ptr = *str;,然后使用*ptr 扫描字符串;当您到达转换结束时,您将在返回之前将当前指针复制回 (*str = ptr;)。
  • 所以为扫描创建了一个字符串,然后将其转换为单词在哪?如果我做对了,这实际上很有意义。为什么指针指向指针呢?
  • 因为你需要能够修改调用函数中的指针值——参见Rex Barzeeanswer

标签: c function pointers syntax


【解决方案1】:

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

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;
}

【讨论】:

  • 感谢雷克斯的回复!澄清一下,我是否需要两个 char 方法才能使其工作,或者您只是在演示?另外,我仍然不清楚指向指针的指针是如何工作的。
  • 你是对的。我两次调用该方法只是为了证明它可以完成。如果您的输入字符串中只有一个数字,那么您当然只会调用该方法一次。
  • 指向指针的参数可以这样解释:第一个星号允许您将指针传递给字符串。第二个星号使该方法可以返回与您传入的地址不同的地址。
【解决方案2】:

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

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

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

【讨论】:

  • Dweeberly,非常感谢您的回复!它确实解决了我一直遇到的一些问题。一些后续行动:我理解 char *strg 但函数定义在 str 前面有两颗星。这只是一个错字还是比这更令人费解?另外,字符串在函数范围内可能指的是什么?这个词是我需要的信息,字符串是它的地址还是其他东西?再次感谢!
  • 他们使用 ** 的原因是他们想要返回扫描停止的位置,否则他们会使用 * 从技术上讲,这被认为是“副作用”,并不是特别可取,但你看到它很多。为了将指针返回到他们停止的位置,他们必须让你给他们指向该指针的指针,以便当他们改变它时,你可以取回改变的点(内部 char*)。
  • 这里开始看到曙光了!您能否详细说明扫描停止的位置?我正在尝试使用此位置来监控 COM 端口,扫描开始/停止在哪里?
  • 对不起,我真的不知道函数的内部,我继续你发布的内容和很多假设。文本表明它正在返回它停止扫描的地址,我猜是因为它找到了它正在扫描的内容。
猜你喜欢
  • 2013-02-09
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多