关于C中哈希表插入函数传参为何必须二级指针的问题

C中哈希插入键值 传入的哈希表为何必须是双重指针类型?
我自己试过传入

set 的内部实现是双向链表
那我插入操作是无需修改整个外部结构的地址一个个上链即可
但在 传参一致性没问题的如下情况下 我传递结构体指针为何没有进行实际的插入

void insertSet(mySet *set,int mykey)
  insertSet(set2,nums2[i])

如上 我发现根本没有插入,有没大手子 能指点一下



typedef struct MY_SET
{
    int key;//key值
    //type char [100];自定义类型可以不存在  只关心KEY KEY不可以重复
    UT_hash_handle hh;

}mySet;



mySet *find(mySet *set,int mykey)//传入指向SET的指针 以及键值、
{
    mySet *tmp;
    HASH_FIND_INT(set,&mykey,tmp);
    return tmp;
}


void insertSet(mySet **set,int mykey)
{
    mySet *judge =find(*set,mykey);

    if(judge == NULL)
    {
      judge = (mySet *)malloc(sizeof(mySet) );
      judge->key = mykey;
      HASH_ADD_INT(*set,key,judge); 
    }
}
int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){
    //1放入哈希 转为哈希
    //2遍历查询哈希表是否出现 若出现放入res
 
    int* res ;
    int i,cnt1,cnt2,cnt;
    mySet *set1 =NULL;
    mySet *set2 =NULL;
    mySet *s ,*tmp;
    mySet *p;
    *returnSize=0;

    for(i=0;i<nums1Size;i++)
    insertSet(&set1,nums1[i]);

    cnt1 =HASH_COUNT(set1);

    for(i=0;i<nums2Size;i++)
    insertSet(&set2,nums2[i]);

    cnt2 =HASH_COUNT(set2);
 
    res = malloc(sizeof(int) * (cnt1+cnt2));

    if(cnt1>cnt2)
    {
        HASH_ITER(hh,set2,s,tmp)
        {
            if(find(set1,s->key))
            res[(*returnSize)++] = s->key;
        }


    }
    else
    {
        HASH_ITER(hh,set1,s,tmp)
        {
            if(find(set2,s->key))
            res[(*returnSize)++] = s->key;
        }

    }


return res;

}

因为下面要调用的HASH_ADD_INT函数里需要一个指针类型
如果你的set本身就只是一个一级指针,那到下面*set它变成一个结构体了,不是结构体指针了
包括find函数里也一样需要一个指针类型
你要改,那要把里面所有调用的函数也都改掉,只改一个那肯定下面类型全都不对了

用指针的指针只会有一个原因,就是函数内要修改指针的地址

利用指针向主程序返回值,也就是说调用者的实参要在调用完改变,那么就需要指针,而这个参数类型本身也是指针,那么就是指针的指针。
看下面的演变过程
void foo1(int i)
{
i = 4;
}
int i = 3;
foo(i);
此时i还是3


void foo1(int *i)
{
*i = 4;
}
int i = 3;
foo(&i);
此时i是4


void foo1(int *i)
{
i = (int *)malloc(sizeof(int);
}
int *i = NULL;
foo(i);
此时i是i还是NULL


void foo1(int **i)
{
*i = (int *)malloc(sizeof(int);
}
int *i = NULL;
foo(&i);
此时i是i指向了分配的地址。

我说一下我知道二级指针传递的是指向针指的地址,但是我不清楚为什么插入需要涉及到SET初始指针的修改?每一次插入难不成set的地址是变化的?