【问题标题】:C++ Pointer problemC++ 指针问题
【发布时间】:2011-04-15 06:06:54
【问题描述】:

我遇到了一个我似乎无法弄清楚的指针问题。似乎我已经以这种方式使用了 1000 次指针,所以我不太确定这里发生了什么。我有以下代码:

int iRetVal;
CycleCountOrder* cycleOrder =  NULL;
CycleCountLineItem* cycleLine = NULL;


iRetVal = m_CycleCount.GetCCOrderLine(pOneLocation.szOrderNum[c], cycleOrder, cycleLine);

每当我调用 GetCCOrderLine 时,我都会进入函数内部,并将有效值分配给指针 cycleOrder 和 cycleLine。当我跳出 GetCCOrderLine 函数时,引用再次为 NULL。下面的代码是 GetCCOrderLine 是如何定义的:

头文件

int GetCCOrderLine(CString szOrderLnitem, CycleCountOrder* cycleOrder, CycleCountLineItem* cycleCountLine);

cpp 文件

int CCycleCount::GetCCOrderLine(CString szOrderLnitem, CycleCountOrder* cycleOrder, CycleCountLineItem* cycleCountLine)
{
    CString szCurrOrderLnitem;
    for(int c = 0; c < m_Orders.GetCount(); c++)
    {
        CycleCountOrder* currentOrder = m_Orders[c];

        for(int d = 0; d < currentOrder->m_LineItems.GetCount(); d++)
        {
            CycleCountLineItem* currentLine = currentOrder->m_LineItems[d];

            szCurrOrderLnitem.Format("%s-%d-%d", currentOrder->szOrderNum, currentLine->nLnitemNum, currentLine->nSubitemNum);

            if(szCurrOrderLnitem == szOrderLnitem)
            {
                cycleOrder = currentOrder;
                cycleCountLine = currentLine;
                return FUNC_OK;
            }
        }
    }

    return FUNC_ERROR;
}

此外,在上述代码中访问的两个数组用于为传入的指针赋值,声明如下。这些数组也填充了使用 new 运算符创建的对象:

CArray<CycleCountOrder*, CycleCountOrder*> m_Orders;
CArray<CycleCountLineItem*, CycleCountLineItem*> m_LineItems;

【问题讨论】:

  • 请不要使用&lt;code&gt;标签来格式化你的代码,而是缩进4个空格,或者按下101010编辑器按钮。我现在为你修复了格式:-)

标签: c++ pointers pass-by-reference pass-by-value


【解决方案1】:

如果您想修改原始指针,您的函数应该接收指向指针的指针。

否则,您只需获取指针值的副本并修改此副本。

// will modify the copy
void ptr( MyClass * ptr_copy )
{
    ptr_copy = new MyClass();
}

// will modify the original ptr
void ptr2ptr( MyClass ** ptr_2_ptr )
{
    *ptr_2_ptr = new MyClass();
}

【讨论】:

    【解决方案2】:

    如果您希望指针的更改反映在调用者中,则通过引用传递指针。

    #include <iostream>
    using namespace std;
    
    void f(int *pnochange, int *&pchange){
       pnochange++;
       pchange++;
    }
    
    int main(){
       int buf[] = {1, 2};
    
       int *p1, *p2;
       p1 = p2 = buf;
    
       f(p1, p2);
    
       cout << *p1 << *p2;    // prints 12
    }
    

    【讨论】:

      【解决方案3】:

      通过引用传递

      【讨论】:

        猜你喜欢
        • 2010-11-15
        • 2011-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多