C / Objective C指针声明

时间:2011-10-26 06:42:23

标签: objective-c pointers floating-point

我有一个函数需要float**类型的参数,但我不知道如何声明和初始化这个变量。

有人可以就此提出任何建议吗?更好的是,它是什么类型的变量?我已经查了几天了,任何搜索结果都是空的。

由于

修改

这是有问题的功能

    - (OSStatus)getBuffersInner:(float**)buffers numberOfBuffers:(int)chnls samples:(int)samples
    {
        int i, j ;
        UInt32 frames ;

        // zero out requested buffers if client needs more channels than exist in the channel map
        for ( i = numberOfMappedChannels; i < chnls; i++ ) memset( buffers[i], 0, samples*sizeof( float ) ) ;

        //  place buffer pointers into bufferList, following the channelMap
        for ( i = 0; i < fileDescriptor.mChannelsPerFrame; i++ ) {
            j = inverseChannelMap[i] ;
            resampledBufferList.list.mBuffers[i].mData = ( j < 0 || j >= chnls ) ? zeros : buffers[j] ;
        }
        frames = samples ;
        return ExtAudioFileRead( audioFileRef, &frames, &resampledBufferList.list ) ;
    }

6 个答案:

答案 0 :(得分:5)

这是一个指向指针的指针。以下是一个示例用法:

float f = 0.123;
float *pf = &f;
float **ppf = &pf;

cout << *pf << " == " << **ppf << endl;

您可能需要查看this

答案 1 :(得分:1)

指针可用于多种用途。在这种情况下,它可能用于动态内存和更改函数中的(指针)值。 通常,它可能是:

void getFloat(float** fl)
{
  *fl = new float(1.2);
}

int main()
{
  float* fl;
  getFloat(&fl);
  std::cout << *fl;
  delete fl;
}

请注意,传递参数作为指向更改的指针比C ++更具C风格,尽管为了清晰起见,有些人更喜欢传递引用。 在C ++中也不鼓励使用原始指针来动态内存。

答案 2 :(得分:0)

float **ppfloat = new float*;
*ppfloat = new float;
**ppfloat = 3.14;

delete *ppfloat; //actually deletes the float
delete ppfloat; //actually deletes the pointer to float

只是一个&#34;指向浮动的指针&#34;:只是分解句子。

答案 3 :(得分:0)

在您的代码中,float** buffers包含指向float*的指针向量。例如,在普通C:

size_t numberOfBuffers = ?;
size_t bufferSize = ?;
unsigned i;

typedef float* buffer_t;

buffer_t* buffers = (buffer_t*)malloc(sizeof(buffer_t) * numberOfBuffers);

for(i=0; i<numberOfBuffers; ++i)
{
    buffers[i] = (float*)malloc(sizeof(float) * bufferSize);
}

答案 4 :(得分:0)

从您显示的代码中,看起来函数正在使用 float**作为指向数组[chnls] of pointers to floats[ samples`]的指针。在这种情况下,最好的解决方案可能就是使用 类似的东西:

std::vector<float> data( chnls * samples );
//  Fill data...
std::vector<float*> args( chnls );
for ( int i = 0; i != args.size(); ++ i ) {
    args[i] = &data[0] + (samples * i);
}

&args[0]传递给函数。

(如果这看起来很复杂,那就是。这就是我们付出的代价 必须接口C.如果目标函数是C ++,有 比使用float**更好,更好的解决方案。)

答案 5 :(得分:-1)

它是float [n] [m]矩阵。类似于int main(int argc,char ** argv),其中argv是一个'strings'数组,一个char数组数组。