简单的一句话概括:

*是取数据 , &是取地址

也可以理解为 &是引用 *是解引用


例子1:解引用

a=10;

p=&a     把a的地址取出来,赋值给p,p等于一个地址

* p=1000   p这个地址(p是个地址)里写入数据 1000

// p=1000 是往存放变量p的地址 里写如数据1000

区别在于   一个是  p本身是个地址   一个是存放变量p的地址

                一个是 p 是个地址         一个是p是个变量   


例子2:引用

//引用:相当于给变量起别名

    int a = 1

    int &b = a;

   //这时, 操作 变量b, 就是操作的变量a的地址, 变量a的值也会跟着改变,

// 引用在  传递参数的应用

 

        /*定义函数*/

       void 函数名(int c){

           输出 c

        }

       /*调用函数*/

       int a = 1;

       函数名(a)

/*

当调用上面函数时, 就相当于在函数体内  定义了一个   参数一 = a

所以  当定义函数时  写成   函数名(&c){} ,

就相当于在函数体内写了一个    &c = a

此时,相当于给a变量起了一个别名:c

改变c的值,a也会改变

相当于只是传递了一个a的地址.

*/

 

int a = 10;

int &ref = a; /*定义一个引用,相当于给变量a起了一个别名:ref

              编译器内部会转换成:

              int* const ref = &a

              */

 

ref = 20;//内部发现ref是引用,自动帮我们转换成: *ref = 20

还有一个关键,在C语言中字符串常量的本质表示其实是一个地址,这是许多初学者比较难理解的问题。。

例如:

char * p="hello";

为什么可以把一个字符串赋值给一个指针变量?这不是类型不一致吗?

实际上  hello虽然我们看起来是一个字符串  但是编译器看他 就是一个地址,而且是首地址

也就是说   char * p ="hello"   的意思是    把储存 hello 的首地址  赋值给 p 

即字符串常量的本质表现是代表它的第一个字符的地址。。。。。。。。。

搞清楚这个问题。。

 那么 %s ,它的原理其实也是通过字符串首地址输出字符串,

printf("%s ", p);  

printf("%s ","hello");  

传给它的其实是s所保存的字符串的地址。。。


指针的用法: http://www.qingzhouquanzi.com/225.html

&引用的用法:http://www.qingzhouquanzi.com/264.html