C⼀C++中的指针和引用

2024-12-31 14:24:07
推荐回答(3个)
回答1:

你首先要明白,指针运算符的作用,我用一言以概之,你在哪里使用都不会错。指针运算符*的作用是求出*后面所指地址里的值。因此只要*后面的变量表示的是一个地址就可以使用*运算符,来求出这个地址中的值,你不用管这个地址的表示形式是怎样的,只要是地址就可以使用*来求出地址中的值。

因此i=*&p; 错误,因为p是指针,那么&p表示的是指针p的地址,那么*&p表示的就是指针p的地址中的值,也就是p了,这个值也是个地址,变量i要求的是一个整型值,因此错误。这里要注意,指针p同样有地址,而且也有值,指针p的值就是p,但这个值是另一个变量的地址。
q=**&p; 错误,*&p的解释同上,而**&p就是求指求p所指负的地址的值,也就是*p的意思,而q要求是一个地址,因此错误。
i=&*p; 错误,*p表示p所指地址处的值,&*p表示对p所指向的值再求地址,因此是错误的,因为i要求是一个整数,而不是一个地址。
p=&*&i; 正确,因为*&i就等于i的值,而&i表示的就是i的地址,因此正确。
q=*&*p; 错误,简单的判断方法就是最左边的运算符为*运算符,这个运算符的结果是一个值而不是地址,因此肯定错误。具体一点就是*p指的是p所指地址处的值,而&*p也就等同于p了。
i=*&*p ; 正确,原理同上面的解释

回答2:

1. p是指针,指向变量a,所以p里面存放的内容是其所指内存的地址(即a的地址,&a)。*p相当于读取p所指内存中所存放的值,也就是a的值,所以*p是一个整数 (你的例子里的30)

2.
其实你可以把 &和*看成两个相反的操作,所以如果同时出现&和*,那么&和*就被消掉了 (类似于 -1 + 1 = 0 一样),用这一原则来处理下面的题目就行了。

i=*&p; 错, *&p 消掉 *&后变成 p, 你不能把p付给i,应该是i=*p
q=**&p; 错,应该是 i=**&p 或者 q=*&p
i=&*p; 错, 应该是 i=*p 或者 q=&*p;
p=&*&i; 对了
q=*&*p; 错, 应该是q=&*p
i=*&*p; 对

回答3:

“引用”这个东西其实挺搞的,有时候很多人都分不清引用和指针有什么区别。因为有时候它们可以完成相同的工作,例如我写2个程序看一下:
第一个:
#include
using namespace std;
int main()
{
int a=5;
int *p=&a;
*p=3;
cout<<"a="< return 0;
}
第二个:
#include
using namespace std;
int main()
{
int a=5;
int &b=a;
b=3;
cout<<"a="< return 0;
}
这样一运行就明白了,引用或者指针都完成了这样一个工作,但是它们内部是存在着区别的,区别在于指针在诞生的时候它占用了内存空间,因为指针本身是一种变量类型,而引用并没有占用内存空间,引用可以用“别名”来理解,就像别人叫我名字不是很习惯,不如叫一声“猴子”来的亲切。事实上在我所知的所有引用的使用方法中它从来都是不占用内存空间的,真的是无欲无求!所以很多情况下,引用作为函数形参是提高程序效率的一种普遍采取的方式。此外,明显的区别如下:
指针:
int ival=1024,ival2=2048;
int *pi=&ival,*pi2=&ival2;
pi=pi2;
赋值结束后,pi所指向的ival对象值保持不变,赋值操作修改了指针pi的值,使其指向令一个不同的对象。

引用:
int &ri=ival,&ri2=ival2;
ri=ri2;
这个赋值操作修改了ri引用的值ival对象,而并非引用本身。赋值后,这2个引用还是指向原来关联的对象,此时这2个对象的值相等。