【问题标题】:Updating pointer address in function, when passed as an argument. [ passing pointer as reference in C]当作为参数传递时,更新函数中的指针地址。 [在C中将指针作为引用传递]
【发布时间】:2014-06-06 16:46:03
【问题描述】:

概念:通过引用传递指针

尝试实现:从函数中获取更新的指针地址,当作为参数传递时。

int main(void)
{
    uint8_t unArray[10] = {0};  // unint8_t is type def as unsigned char
    uint8_t * pmyPtr;

    pmyPtr = unArray;

    func(pmyPtr);

    *pmyPtr = someValue3; 

}

void func(uint8_t * unPtr)
{
    *unPtr = someValue1;
     unPtr++;
    *unPtr = someValue2;  
     unPtr++;  

}

假设我们的 unArray 地址为 0x0001000。因此 pmyPtr 将有 0x0001000 作为其分配的常量指针。

当指针传递给函数 func 时,数组的一些索引(前两个)被 DE 引用更新。

当我在 func 执行后回到主目录时,我正在尝试更新第三个索引。这怎么可能实现。我有一种预感,双重取消引用可能会很方便。

【问题讨论】:

  • 从函数 func 返回递增的指针并将值保存到其中。稍后使用保存的旧指针访问此数组,当然您需要根据该指针更改原型。
  • @Dayalrai 是的,这是一个可能的解决方案,但我想避免这种方法。当作为参数传递时,我想抓住通过引用更新指针的概念。
  • 不应该把uint8_t * pmyPtr;读成uint8_t * myPtr;吗?
  • @vishram0709 *myPtr 不会更新第三个索引,而是会更新第一个索引。尝试在您的 IDE 中进行调试。谢谢你
  • @alk 谢谢。那是一个错字。更新

标签: c pointers embedded pass-by-reference dereference


【解决方案1】:

你是对的。指向指针的指针是一个简单的解决方案。在 c++ 中,它可以作为引用在语法上隐藏。

main()
{
    uint8_t unArray[10] = {0};  // unint8_t is type def as unsigned char
    uint8_t * myPtr;

    myPtr = unArray;

    func(&myPtr);//NOTICE ADDRESS TAKING

    *myPtr = someValue3; 

}

void func(uint8_t ** unPtrPtr)//ONE MORE STAR
{
    uint8_t * unPtr=*unPtrPtr;//CHANGED
    *unPtr = someValue1;
     unPtr++;
    *unPtr = someValue2;  
     unPtr++;
    *unPtrPtr = unPtr;//CHANGED
}

【讨论】:

  • 这种使用本地指针的方法很好,因为它比直接使用指向指针的指针提供了更好的可读性。没有人愿意阅读看起来像 *(*unPtrPtr)++; 的代码
  • @Osaid 好的,我现在添加了所有#defines,编译(在 Linux 上),它可以工作:**BEFORE myPtr=0xbfa89332 AFTER myPtr=0xbfa89334 **。我应该编辑我的答案以包含调试 printf 吗?
  • 众所周知,Linux 上的 gcc 会将常量放在只读段中,因此尝试更新常量字符串可能会导致核心转储,但在此示例中 myPtr 是可以通过任何标准完美修改。 @Osaid 你的环境是什么?
  • @MadaaKaama 你是对的,跳过了最后一行 [*unPtrPtr = unPtr;] 这是核心。
  • @MaadaKaama IDE 是在 Windows 上运行的 HEW(C 编码)
猜你喜欢
  • 1970-01-01
  • 2021-10-05
  • 2020-11-08
  • 1970-01-01
  • 2012-01-24
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 2017-01-08
相关资源
最近更新 更多