C语言新手,正在努力使用*,&;引用对象

C语言新手,正在努力使用*,&;引用对象,c,C,我对C非常陌生,来自deep PHP&BASH,在这里变量使生活变得简单。我试图理解在C语言中如何在main()中创建一个对象,然后调用一个在这个对象上工作的secondFunction(),然后返回到main()将这个对象合并回程序中 我可以让脚本编译,但它会在main()merge上抛出一个segmentation错误 在阅读了大量文章和教程后,我想我混淆了何时使用myVar,*myVar,&myVar scriptOne.c->main() scriptOne.c->doAddBin()

我对C非常陌生,来自deep PHP&BASH,在这里变量使生活变得简单。我试图理解在C语言中如何在
main()
中创建一个对象,然后调用一个在这个对象上工作的
secondFunction()
,然后返回到
main()
将这个对象合并回程序中

我可以让脚本编译,但它会在
main()
merge上抛出一个
segmentation错误

在阅读了大量文章和教程后,我想我混淆了何时使用
myVar
*myVar
&myVar

scriptOne.c->main()

scriptOne.c->doAddBin()

因此,我认为我没有正确使用
*
,需要将其替换为
&
以停止
分段错误


感谢C中的Art,所有函数参数都是按值传递的。因此,更改函数参数的值在函数外部是不可见的

但是,您可以做的是使用
&
运算符传递变量的地址,然后在函数内部使用
*
运算符取消引用该指针,以便实际更改调用函数中的变量

// accept the address of a pointer
void doAddBin(GstElement **MyBinAlpha){
    char *bin_name;
    bin_name="bin_0";
    // derefernce the pointer to assign to myBin in main
    *MyBinAlpha = gst_bin_new (bin_name); <--This is where object is produced

    doWorkOnBin(*MyBinAlpha);

    ScriptTwo.c -> doWorkOnBin();
}

int main(){
    GstElement *myPipeline;
    GstElement *myBin;
    // pass in the address of the pointer
    doAddBin(&myBin);
    // now myBin has been updated     
    gst_bin_add (GST_BIN (pipeline), myBin);
    return 0;
}
//接受指针的地址
void doAddBin(GstElement**MyBinAlpha){
char*bin_名称;
bin_name=“bin_0”;
//在main中取消指向myBin的指针
*MyBinAlpha=gst_bin_new(bin_name);doWorkOnBin();
}
int main(){
GstElement*myPipeline;
GstElement*myBin;
//传入指针的地址
doAddBin(&myBin);
//现在myBin已经更新了
gst_bin_add(gst_bin(管道),myBin);
返回0;
}

使用指针(即所谓的指针)可能会让人非常困惑。花一些时间简单地学习指针的确切含义。大学生需要一个学期才能完全掌握它,所以不要感到气馁。你能提供一份你的代码吗?另外,您将C代码称为“脚本”,即.@j.seashell,感谢您提供的文档,我很接近,但之前没有遇到
**
,这有助于可视化过程。哇,我非常接近,因为我尝试了这种组合,但没有使用
**
。我必须仔细阅读
**
,因为我以前从未见过它。如果我将这个概念扩展到线程,那么逻辑是否保持不变?非常感谢你简洁的回答@dbush@artvanderlay当
*
创建或取消引用指向对象的指针时,
***
只对指向对象的指针执行相同的操作。。。由于指针只是一个保存地址的变量,那么您当然可以创建第二个变量来保存保存另一个地址的变量的地址,即第二个地址现在指向指向对象的地址。(是的,如果需要,这可以通过某种方式进行扩展,以添加大量的间接寻址,如
int*******p;
,但在良好的设计中,不应该要求它)
void doAddBin(GstElement *MyBinAlpha){
    char *bin_name;
    bin_name="bin_0";
    MyBinAlpha = gst_bin_new (bin_name); <--This is where object is produced

    doWorkOnBin(MyBinAlpha);
void doAddBin(GstElement *MyBinBeta){
    src1 = gst_element_factory_make ("filesrc", "idFileSrc");
    gst_bin_add (MyBinBeta,src1);
    return;   // work now finished, return to main()
              // where myBin now contains src1
// accept the address of a pointer
void doAddBin(GstElement **MyBinAlpha){
    char *bin_name;
    bin_name="bin_0";
    // derefernce the pointer to assign to myBin in main
    *MyBinAlpha = gst_bin_new (bin_name); <--This is where object is produced

    doWorkOnBin(*MyBinAlpha);

    ScriptTwo.c -> doWorkOnBin();
}

int main(){
    GstElement *myPipeline;
    GstElement *myBin;
    // pass in the address of the pointer
    doAddBin(&myBin);
    // now myBin has been updated     
    gst_bin_add (GST_BIN (pipeline), myBin);
    return 0;
}