我在理解代码时几乎没有概念上的问题 以下是说明
char dest[100];
char *info;
Byte *ie;
功能声明说
getValue(Byte tag, Byte *msg, int len)
我们传递类似
的内容getValue(0X01, &info[4], 30);
这里我理解我将值的地址传递给指针。
现在有第二个功能
retriveValue( Byte *ie, Byte *digits, Byte totalLen)
在这个函数中我们传递类似
的东西retriveValue(&ie[3], (Byte*)&dest, 2);
在这里,我想,我们将char转换为byte类型的指针并将Address传递给它。
现在我的问题是:
(Byte)&dest
?char*
类似于char *dest;
,我将如何传递?答案 0 :(得分:1)
retriveValue(&ie[3], (Byte*)&dest, 2);
这里的第二个参数你已经取得了dest&的地址然后指针将其转换为(字节*)
1>如果我将dest转换为字节并传递地址(如字节)& dest会有什么问题?
通过执行此操作,您将dest的地址转换为字节。(不是字节指针)
2>如果dest的类型为char *,我将如何传递,例如char * dest;?
然后无需添加“&”写一下
retriveValue(&ie[3], (Byte*)dest, 2);
答案 1 :(得分:0)
“我们传递类似”
的内容getValue(0X01, &info[4], 30);
你现在好吗?因为在那里建立了可怕数量的坏业力。
首先,传递十六进制值有点奇怪。您可以传入常量或#defined值,如TAG_01。在你的申请中,它可能完全没问题,但我会保持警惕。
第二个论点是它变得可怕的地方。 info是一个指针(可能设置为& dest),info保存的值是您指向的东西的地址。如果你想传入一个地址,你会指向那个东西,然后传入信息,没有符号或像对待数组一样。您正在使用方括号[]来获取dest的元素,然后获取该地址。
现在,可能是你以一些巧妙的方式使用指针,而你确实想要引用它之后的第4个字节。但我对此表示怀疑。你可能只是在指点看看它们是如何工作的,这很好。但是当你开始制作东西时,如果你想传递一条消息,请声明一条消息然后发送。不要将字符串嵌入到较大数组的一部分中。这是糟糕的形式。请改用结构。
这里我理解我将值的地址传递给指针。
好吧,你要将地址传递给函数,而不是指针。
“在这个函数中,我们传递的东西就像”
retriveValue(&ie[3], (Byte*)&dest, 2);
同样,我对这是多么可怕的错误感到冷汗。永远不要这样做。你说的这个邪恶的“我们”是谁?你是不是在某种可怕的邪教中吟唱一种无法形容的C方言,试图迎来一个黑暗的Cthulu统治?是不是͟com͠e̴͝?̢̛͟
无论如何,崇拜抛弃,
如果我将dest转换为字节并传递地址(如字节)& dest会有什么问题?
正如Monsieur 32指出的那样,如果你这样做,你就不会传递一个地址,你正在通过一个字节。请记住,字节长度为8位。这是一个字符。地址通常为32或64位,具体取决于环境。因此,当你像这样投射它时,你将丢弃所需数据的3/4,并且它不符合函数的定义。这是对自然的罪。
如果dest的类型为char *,我将如何传递,例如char * dest;?
是的,只是dest
,所有平原和香草本身。这是因为dest
不是char。它被声明为dest[100]
,这意味着dest[0]
是一个char,但dest是dest[0]
的地址,就像一个指针。
数组约定实际上只是为了帮助保持正确而有点模仿指针。 *(dest+3)
和dest[3]
之间没有功能差异。在技术层面上,数组和指针的不同之处在于,dest
之类的数组声明在编译时将被视为const
,因此它不会占用任何RAM。一个char *指针会拥有它自己的一小块RAM,你可以在循环遍历数据时增加它,但只有深陷的黑暗指针使用这样的指针。他为什么睡觉?无尽的循环,因为他没有正确地投射他的指针。
最后,如果你已经接受了Mr.32的答案,那是先于我的答案,你真的应该把它放回去。对死去的外星神说不。