【技术】C语言传递指针到函数 About transfer pointer into function

本文通过两个实例介绍如何在C语言中使用指针传递数组及结构体数据到函数中进行处理。首先展示了如何传递浮点数数组给Goertzel算法函数进行信号处理,并返回处理后的结果。其次,通过钢琴演示项目的例子说明了如何将包含16位数据数组的结构体指针传递给函数,修改结构体内的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     About transfer pointer into function (C Language)

In the main() function of our program, we often need to use some user defined functions to do our calculating work.

For a user_function, we may transfer into several int variable, and return a variable.
or, we may need modify a data array by calling a function. And return void.
or, we may need modify a data array in a struct, and call a function to modify that data array. We need to transfer into the function the pointer of that struct containing our data array.

1. Transfer into function the pointer of An data array:

   Take the example of my project: "Audio_Goertzel_Algorithm"
【声数函,方括号;调函数,没括号】
        //--------Some delaration in main() function: ---------
    float data_Re[1024]; // Array of Real part of data
    float data_Im[1024]; // Array of image part of data 
    float abs_x[1024];
    int length_kArr = 8; // k is array of number of X
    int kArr[length_kArr];
    int num_data = 1024; // Length of array x[i]


    //--- Prepare the value of k[] ----
    kArr[0] = 87;   // kArr = [0:1:15] ; length_kArr = 16
    kArr[1] = 96;   // 770*num_data/fs
    ...
    kArr[7] = 204;

    //--------Process the data by calling the usr_function: goertzel() ----
    goertzel(data_Re, data_Im, num_data, kArr, length_kArr);  
    
    ///////////// The difinition of usr_function in the file "user.c"///////////
    void goertzel(float addr_Re[], float addr_Im[], int N, int kArr[], int length_kArr)
    {
        // Input the data for processing: // Here we can use "static float array[...]" as global var!
        float X_Re[1024];
        float X_Im[1024];

        memcpy( x_Re, addr_Re, 4*N);  //float occupy 4 bytes per element.
                // memcpy(void *dest, void *src, unsigned int count);
        memcpy( x_Im, addr_Im, 4*N);  //float occupy 4 bytes per element.
        // you can also process addr_Re instead of x_Re, 
        // so that you don't need to memcpy like above.

        //----Begin of processing ----------
        ...
        //---- End of data processing ---

        // Output the data processing result:
        memcpy(addr_Re, X_Re, 4*1024) ;  // address_Re store the adr of Re Array of process result
        memcpy(addr_Im, X_Re, 4*1024) ;  // address_Im store the adr of Im Array of process result
    
        return;
    }


    
-------------End of section 1. ----------------

Section 2. Transfer the pointer of Struct of a data array into function:

   Take the example of my project: "Piano_demo"
   in file "common_data.h", the struct is defined here:
【声结构,方括号;声调函,没括号】
   
    struct data_1024res16 {
        int samplingrate;
        int datares;
        int nsamples;
        int nchannels;
        int16_t data[1024];  // Here is the data array that we're going to modify.

    };
        
    //--------Some delaration in main() function: ---------

    #include"common_data.h"
    struct data_1024res16 MyStructArr_y[1000]; // Declared 1000 StructArray, each StructArrady contains:
                    //int samplingrate;int datares;int nsamples;int nchannels;int16_t data[1024];
                    //int16_t data[1024] is 1024 16bit data buffer.

    //--------Process the data by calling the usr_function: sound_x() ----
    // modify the data in MyStructArr_y.data by calling this function
    sound_x(MyStructArr_y, fs, 494);  



    ///////////// The difinition of usr_function in the file "user.c"///////////
   
   

    void sound_x(struct data_1024res16* MyStructArr_y, int fs, int F)
    {

        short data1[1000];   // use 1000 >> 20 for sufficient. only 20 data1[] are used.
        //----Begin of processing ----------
        ...
        //---- End of data processing ---
    
        // Output the data processing result:
        for(i = 0; i < 20; i++)
        {
            memcpy(MyStructArr_y[i].data, data1, 2*1000);
        }

        return;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值