关于指针变量,*p和p到底有什么区别啊?

在写代码时该怎么选择?... 在写代码时该怎么选择? 展开
 我来答
iiiiiiiipl
2019-06-27 · TA获得超过9923个赞
知道答主
回答量:68
采纳率:66%
帮助的人:3.9万
展开全部

1、内容不同

星号是用来指定变量p是指针,p是一个变量,其值为另一个变量的地址,它表示了在内存中的一个地址,即,内存位置的直接地址。而*p是所指向地址的值。

2、数据类型不同

在程序声明变量的时候的*,只是表明“它是一个无符号整数,这个整数指向某个内存地址,一次访问sizeof(type)长度”,所有指针的值的实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数。

而*p可以是整型、浮点型或者字符型。

3、使用方法不同

在编程时,*p可以直接使用,因为p声明为一个指针,使用它的时候需要带上*表示该位置的值,比如int a,*p;*p=a。

直接使用p的时候,p=&a。

扩展资料:

另类*和&

1、两个地方要注意: 在程序声明变量的时候的*,只是表明“它是一个无符号整数,这个整数指向某个内存地址,一次访问sizeof(type)长度”。这点不要和(*)操作符混淆;

2、在C++程序声明变量的时候的&,只是表明“它是一个引用,这个引用声明时不开辟新空间,它在内存分配表加入新的一行,该行内存地址等于和调用时传入的对应参数内存地址”。

3、这点不要和(*)声明符,(&)操作符混淆。

参考资料:

百度百科-指针

问明6E
高粉答主

2019-06-27 · 每个回答都超有意思的
知道答主
回答量:279
采纳率:100%
帮助的人:13.2万
展开全部

区别:

以下面的情况说明:

1、int a = 5;

int* p = &a;

结论:

*p   是指针变量p指向的变量a的存储内容,*p = 5;

p   是指针变量的存储内容,因为p指向a,所以p的存储内容(存储空间的值)就是系统为变量a分配的存储地址;

2、分析:

int a = 5;

int* p = &a;

int* q = p;

3、【说明】

1)上面的程序中首先声明了一个int类型的变量a,初始化为5;这个过程为:

2)在初始化时,存储空间存储的是int型的值5,存储地址是由系统自动分配的,同理要声明一个指向a的指针,在初始化的时候赋值给指针变量的值应该是变量a的存储地址,故而有 int* p = &a;

4、在下面的程序中:

int arr[] = { 1, 2, 5, 7 };

int* parr = arr;

同理,要是声明另外一个int类型的指针变量q:

1)int* q = p;

声明了一个int类型的指针变量,并将指针变量p的值赋予q,同样是变量,a = 5,5是变量a的存储空间的值,那么p=?,p等于p存储空间的那个值,即p=#ffa1(a的存储地址);

现在将这个值赋给了指针变量q,正如a初始化的过程一样,int a=5的过程,是将5存储在了int类型变量的存储空间之中,初始化指针变量q时,也是将等号右边的值存储在q的存储空间之中,上边的操作的结果如下:

使得指针变量q指向了变量a。

5、【说明】

从上面的操作可以看出,&p代表的是指针变量p的存储地址。

int* q = *p;

声明了一个指针变量q,并对其初始化,这一过程的操作如下:

为指针变量q初始化,q的存储空间中存储的值为5.

【说明】

1、从上面的操作可以看出,是将*p的值赋给了q,p指向变量a,p=#ffa1,而*p的过程就是获得p地址处的存储空间的值,即*(#ffa1)=5,也就是将5赋给了指针变量q,q的存储空间存储的是5;

2、指针变量是指向某一变量的变量,在其存储空间中存储的一般是其他变量的存储地址,上面的初始化过程int* q = *p;是非常危险的,有可能造成程序奔溃。

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
仁0者
推荐于2017-11-28 · TA获得超过526个赞
知道小有建树答主
回答量:118
采纳率:0%
帮助的人:92.4万
展开全部
P的值是指针指向的数据的地址,而*p表示的是指针指向数据的数值,
例如
a=2;//a的地址为1000
p=&a;
则:
p=1000
*p=2
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zsthit
2012-07-27 · TA获得超过463个赞
知道小有建树答主
回答量:155
采纳率:0%
帮助的人:174万
展开全部
首先搞明白一点,printf语句中表达式的执行顺序是从右向左的,并且对于*(q++),首先进行解引用操作,再自增,即*q, q=q+1;所以说第一个printf的输出为2 2
对于第二个printf,首先执行(*q)++,再执行*p++,对于(*q)++可以转化为先执行(*q),即输出它的值,再执行(*q)=(*q)+1,最后输出*p,所以结果为3 2
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wangzuhe0558
2012-11-26 · TA获得超过111个赞
知道小有建树答主
回答量:107
采纳率:0%
帮助的人:96.2万
展开全部
p是一个内存地址值
*p是地址p指向的内容
对地址操作的时候直接用p,对内容操作的时候,用*p
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(10)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式