使用指针作为参数传递

时间:2011-10-05 11:57:22

标签: c pointers

我在理解代码时几乎没有概念上的问题 以下是说明

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传递给它。

现在我的问题是:

  1. 如果我将dest转换为字节并传递地址如(Byte)&dest
  2. ,会出现什么问题
  3. 如果dest类型char*类似于char *dest;,我将如何传递?

2 个答案:

答案 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的答案,那是先于我的答案,你真的应该把它放回去。对死去的外星神说不。