请教C语言里面的指针里面的“*”和“&”用法如何区别一下,各种混乱啊多谢

请问C语言里面的指针里面的“*”和“&”用法怎么区别一下,各种混乱啊!谢谢!
比如定义一个函数 void Add(int * a){..}函数体里面用:a、*a、还是&a...各自作用是什么?C指针不过关啊。。
c语言 指针

------解决方案--------------------
*a代表类型指针,a代表某类型的变量,&a代表某类型的变量的引用
*a 是指向某个地址,字节都是4 , a表示复制一个变量的值,字节与要复制的变量的字节一样大,&a表示引用某一个变量字节与类型有关!
------解决方案--------------------
a、*a、还是&a

对于声明或定义int * a;
a 是一个指针,存放一个地址,a的值就是这个地址。
*a 是指针a,所存放的地址中存放的数据。
&a 指针也是数据的一种,而且它也有个地址,&a就是这个地址。
一切需要存放的数据,都有地址。

一般我们 都只考虑,变量的地址,而不考虑常量的地址;

因为常量,要么没有地址,要么像变量一样,也有一个地址,
这种有地址的常量,当作变量看待就可以了。
 
------解决方案--------------------
int a,int *a都是定义一个局部变量(一个整形,一个指针),它都局部于函数内部。函数结束自动灭亡。
int &a是C++中引用特性,即另一个变量的“别名”。
当外部调用函数,传递参数num(或者&num)时,那么
fun(int a) == a = num;
fun(int *a)== a = #
fun(int &a)== &a = num;
------解决方案--------------------
具体看你这个函数是要干什么了!调用时总归会是

int *b;
...;
add(&b);

在add函数内
a表示b的地址,只是个形参,调用过程中不会对原本b产生任何影响!
*a表示b的值,对*a的修改直接反馈到b的值上面。
&a表示的是一个二级指针,存放的是a的地址也就是b的地址的地址,类型是int **,你这个函数估计是不会用到的!
------解决方案--------------------
变量a 本质上代表一个存储单元。CPU通过该存储单元的地址访问该存储单元中的数据。所以a本来代表两个值:存储单元的地址和储单元中的数据。于是就有了二异性。为了消除这种二义性,C语言规定a表示存储单元中的数据,&a表示存储单元的地址。
a存储单元中的数据可以是一个普通数值,也可以是另一个存储单元的地址,比如:a = &b; 语句就是将b的存储单元的地址存入a存储单元中。C语言规定*a代表a中存储的地址对应的存储单元中的数据,也就是访问*a就等于访问b,于是*a提供了通过a访问b中的数据的手段。

a表示a对应的存储单元中的数据。
&a表示a对应的存储单元的地址。
*a表示:首先,要求a对应的存储单元中的数据一定是另一个存储单元的地址。
        于是,*a表示另一个存储单元中的数据。
当a声明的类型是int时,a中存储的是一个整数数值,通过a可以访问(读取或修改)这个数值。
当a声明的类型是int*时,a中存储的是一个存储单元的地址,而该存储单元中存储的数据是一个整数数值;通过*a可以访问(读取或修改)这个数值。a == &*a 都是该存储单元的地址。
当a声明的类型是int**时,a中存储的是一个存储单元的地址,而该存储单元中存储的数据是另外一个存储单元的地址,另外这个存储单元中存储的是一个整数数值;通过**a可以访问(读取或修改)这个数值。
...

最后,在C语言里地址叫指针。