一初级篇——指针(*)取地址(&)解引用(*)与引用(&)的区别

Posted synapse7

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一初级篇——指针(*)取地址(&)解引用(*)与引用(&)的区别相关的知识,希望对你有一定的参考价值。

1. 初步了解——指针与取地址

先看程序:

#include<stdio.h>

int main(void)

	int num = 7;
	int *p = &num;//初始化指针,也可以写作int* p = &num;
	printf("%d 的地址是 %p\\n", num, p);
	return 0;
上面int *p定义了一个指向int类型指针p(我们使用*符号把p声明为指针),并初始化p使其指向int类型的变量num,这里&num中的&是取地址操作符,当&作用于一个对象上时,它返回了该对象的地址。

所以这里指针p指向了num所对应的地址。(我测试时输出了0028FF1C)


2. 如何使用指针?——解引用与指针赋值

让我们继续:

#include<stdio.h>

int main(void)

	int num = 7;
	int *p = &num;
	printf("数值%d所在的地址是 %p\\n", num, p);
	printf("指针p所指向的地址为 %p , 该地址上所保存的值为%d\\n", p, *p);
	*p = 100;
	printf("指针p所指向的地址为 %p , 该地址上所保存的值为%d\\n", p, num);
	return 0;

注意这里*操作符为解引用操作符,它返回指针p所指的对象(左值)。

我们可以对*p赋值(对左值赋值),从而改变p所指的地址上所保存的值,从而改变此地址所存储的变量num的值。(上面num的值变为100)


当然,我们也可以给指针p赋值,使其指向另外一个地址(这样就改变了在解引用时获取的左值):

#include<stdio.h>

int main(void)

	int num = 7, another = -5;
	int *p = &num;
	p = &another;
	printf("%d\\n", *p);//此时p指向了another,所以输出了another的值,即-5
	return 0;


3. 引用(引用概念在C++中才有,C中并没有)

从某种意义上来说,引用完全有别于上面说介绍的内容:

#include<cstdio>

int main()

	int val = 7, val2 = 999;
	int &refval = val, &refval2 = val2; ///引用必须要初始化,使其绑定到一个变量上
	///修改引用的值将改变其所绑定的变量的值
	refval = -12;
	printf("%d %d\\n", val, refval);//-12,refval的值和val一样
	
	///将引用b赋值给引用a将改变引用a所绑定的变量的值,
	///引用一但初始化(绑定),将始终绑定到同一个特定对象上,无法绑定到另一个对象上
	refval = refval2;
	printf("%d %d\\n", val, refval);//999
	return 0;

关键:作用在引用上的所有操作事实上都是作用在该引用所绑定的对象上。

可以用int *&refp = p;的方式将一个指针引用和一个指针绑定起来。

PS:如果还是不理解,可以把引用认为是一个对象的别名(外号、简称等等)。(类比#define ...,typedef ...)


答疑:使用引用有何优点?

在传参的时候,使用指针传参,编译器需要给指针另行分配存储单元,存储一个该指针的副本,在函数中对这个副本进行操作;而使用引用传参,编译器就不需要分配存储空间和保存副本了,函数将直接对实参进行操作。所以使用引用使得程序的运行速度更快,执行效率更高。


下一篇:二、中级篇——指针与数组

****转载请注明:http://blog.csdn.net/synapse7/article/details/10260339****

以上是关于一初级篇——指针(*)取地址(&)解引用(*)与引用(&)的区别的主要内容,如果未能解决你的问题,请参考以下文章

大一C语言学习笔记---指针篇--什么是指针?什么是指针变量?取地址符“&”的作用是什么?地址运算符“*”的作用是什么,怎么理解两者?

c语言解引用和取地址操作符?

引用 指针 解引用

C语言中取地址跟C++中的引用是一个意思吗?

C++温故补缺:引用类型

C/C++的指针用法总结