简单的一句话概括:
*是取数据 , &是取地址
也可以理解为 &是引用 *是解引用
例子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所保存的字符串的地址。。。