在没有地址的函数中使用指针

pointer use in a function without address

本文关键字:指针 函数 地址      更新时间:2023-10-16

我会尽量说清楚,但是,如果我最终没有说清楚,我真的很抱歉。我做这个已经有一段时间了,我对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;
}

我的问题是,在第一个函数GetInfo中,为什么可以,甚至合法地传递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是类的成员。我在定义GetInfo的代码顶部将cObj实例化为指针对象

编辑3:为什么我被否决了?我以为当你不知道/不知道答案的时候,尤其是当你是新来的时候,你就会来问问题。你们是不是已经编程太久了都忘了不知道是什么感觉了?天哪…

编辑4:我将提供更多的细节,以防其他人遇到这个。公认的答案很好地解释了这一点。我最初的问题中没有包括的是matlab代码,这可能是以下效果的东西:

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

在calllib函数中发生的事情(我们没有看到)是matlab将calllib中最后两个参数的地址传递给调用函数,如果我在c或c++中编写整个东西,我将不得不在c或c++中完成。

您的具体问题是为什么将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已经是一个指针了。

Ok -似乎是一个不好的例子

cObj看起来像没有显示的全局变量GetChannelInfo不是类的成员函数

函数签名不匹配int GetInfo(int* num, int* ChannelMask, int* ChannelIndex)int GetChannelInfo(int num, int* ChannelMask, int* ChannelIndex)