函数中的 * 与 & 的操作有关问题

函数中的 * 与 & 的操作问题
程序中函数是想变x的值为0
但是将函数中的"*i = c; "换成"i = &c;"就不起作用。求教原因

#include<stdio.h>

SetZero(int*);
int c=0;
main()
{
    int x;
    x=2;
    SetZero(&x);
    printf("c = %d,x = %d,",c,x);
}


SetZero(int *i)
{   
      *i = c;  
  //  i = &c;   ????????????
    printf("i = %d,",*i);
}
下面一个程序中
 //   q = p;这一行为什么不能去;
我想,应该是    *q = 3; 这一行出错,但是,当去调注释(放入q=p时)*d = 1.2;为什么不报错??
#include<stdio.h>

main()
{
    int x = 1;
    int *p, *q ;
    double *d;
    *d = 1.2;
    p = &x;
 //   q = p;
    *p = 2;
    *q = 3; 
    x++;   
    printf("***********************************\n");
    printf("x = %d;\n*p = %d;\n*q = %d;\n*d = %f. ",x,*p,*q,*d);
}

------解决方案--------------------
*i = c; 与i = &c;本来就不一样,前者是用c对i所指向的对象赋值,后者是另i指向c。

int a = 3;
int c = 5;
int * i = & a;
* i = c;
assert( a == c );
assert( i == &a );
assert( i != &c );

a = 3;
c = 5;
i = &a;

i = &c;
assert( a != c );
assert( i != &a );
assert( i == &c );

------解决方案--------------------
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……