指针在没有地址

时间:2015-09-08 23:59:22

标签: c++ matlab pointers

我会尽量保持清醒,但是,如果我最终没有,我会道歉。我已经在这方面工作了一段时间,而且我对c ++很陌生。

编辑2:cObj是另一个文件中定义的类对象

我在matlab中编写了一些包装代码,在c ++中编写了实现代码。我的一些代码使用指针作为函数的参数,其唯一目的是成为c ++函数的c接口。作为一个例子,c接口函数如下所示。

DLLEXPORT int GetInfo(int num, int* ChannelMask, int* ChannelIndex)
{
    return cObj->GetChannelInfo(num, ChannelMask, ChannelIndex);
}

现在我在这里提出问题,我将提供更多代码来说明。

函数GetChannelInfo也接受指针参数,实际上是与GetInfo中完全相同的指针参数。

所以它看起来像这样。

int CCan::GetChannelInfo(int num, int* ChannelMask, int* ChannelIndex)
{
    unsigned char* pChanIndex = &ChanIndex //Class variable
    unsigned long long pChanMaskTx = &ChanMaskTx; //Also a class variable

    *pChanMaskTx = Some Assignment value, lets say 5;
    *pChanIndex = Another assignment value, let's say 6; //just for arguments sake, don't care about the type.

    //Now this is passed to the original pointer value
    *ChannelMask = *pChanMaskTx;
    *ChannelIndex = *pChanIndex;
    return 0;
}

我的问题是,在第一个函数Ge​​tInfo中,为什么它可以正常传递num,ChannelMask和ChannelIndex。 即返回cObj-> GetChannelInfo(num,ChannelMask,ChannelIndex);

一般来说,当我看到互联网上的文章指针时,它就是这样的。

void func(int* B)
{
    *B = *B + 1;
}

int main ()
{
   int A = 5;
   func(&A);
   //Now A is equal to 6 instead of 5
}

传递的地址怎么了?在我编写的函数中(我根据同事代码完成的),它似乎确实有用。但是,我对于为什么或如何运作感到困惑。据我所知,指针在某个时刻需要一个地址。但是,我的代码中没有任何地方发生这种情况。我希望有人可以对此有所了解,以及发生了什么。或者也许我完全错了,而且由于纯粹的意外,它似乎正在发挥作用。

编辑1:num不应该是指针。顺便提一下,问题的关键在于DLLEXPORT部分。 GetChannelInfo是一个类的成员。我将cObj实例化为代码顶部的指针对象,其中定义了GetInfo

编辑3:为什么我会被投票?我认为这是你在不知道/得到答案时提​​出问题的地方,特别是当你是新的时候。你有没有编程,所以你忘记了它不知道的样子?啧..

ANSWER

编辑4:我将提供更多详细信息以防其他人遇到此问题。接受的答案解释得很好。我在原始问题中没有包含的是matlab代码,可能会产生以下影响:

function [status] = GetChannelInfo(num)
    status = calllib('Test','GetInfo',num, 0,0);

上面在calllib函数中发生的事情(我们都没有看到)是matlab将calllib中最后两个参数的地址传递给调用函数,我原本应该这样做如果我用c或c ++写整篇文章,那就用c或c ++做。

2 个答案:

答案 0 :(得分:2)

您的具体问题是将ChannelMask传递给需要指针的函数是合法的。作为答案,请考虑这个

void bar(int *ptr) {
    // ... 
}

void foo(int *ptr) {
    bar(ptr);
}

int main(void) {
    int x;
    foo(&x);
}

您可以看到foobar都需要指针。 mainx的地址传递给foo,因为x不是指针。然后fooptr传递给bar,因为ptr已经是指针。

答案 1 :(得分:1)

好的 - 无论如何似乎是一个不好的例子

cObj看起来像你没有展示的一些全局 GetChannelInfo不是类

的成员函数

功能签名不匹配 int GetInfo(int * num,int * ChannelMask,int * ChannelIndex) int GetChannelInfo(int num,int * ChannelMask,int * ChannelIndex)

ie num是一个指针而不是另一个指针