指针和普通变量有什么区别?

科比布莱恩特 2012-08-02 10:38:09
指针和普通变量有什么区别?为什么要使用指针?性能上有什么优点?

比如:int *p 和 int p有什么区别?

比如我在传参时使用&p与p有什么区别?
...全文
1374 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenxizx 2012-10-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
1+2这个表达式永远得值3
a+b这个表达式只依赖于a,b的值-----按名字访问称为直接访问
*p + *q 这个表达式的值随着p,q指向的变量不同而不同----按指针访问称为间接访问

直接代表简单----用枪剌只能剌到对手的正面
间接代表灵活----用三截棍却能打到对手的背面
[/Quote]

这个回答太妙了
OldCloudM 2012-08-05
  • 打赏
  • 举报
回复 1
本质是一样的,都是存值,但是方式有点区别:指针的值存的是地址值(以支持“间接访问”机制),而普通变量的值存的是实际值。
cao_julians 2012-08-02
  • 打赏
  • 举报
回复
1+2这个表达式永远得值3
a+b这个表达式只依赖于a,b的值-----按名字访问称为直接访问
*p + *q 这个表达式的值随着p,q指向的变量不同而不同----按指针访问称为间接访问

直接代表简单----用枪剌只能剌到对手的正面
间接代表灵活----用三截棍却能打到对手的背面
  • 打赏
  • 举报
回复
就像别人问你家住哪,你给他写张地址条(指针)和带他到你家门口看(变量)一个道理……
cao_julians 2012-08-02
  • 打赏
  • 举报
回复
指针和普通变量的区别,最简单的思考应该按整数的两个不同用法着眼:
整数可以表示序号和数量----数量的概念不必说了,但序号的概念人人都懂但不透彻。
2012表示年----这是序号,它的下一年是2013,即2012+1可得2013,但这里的1是什么?是公元1年吗----是序号还是数量?
2012是今年,2013是明年,两者能相加吗?序号+序号是什么?

指针是什么?指针是严格意义上的序号----存储位置的编号!
所以指针+数量为指针----成立
反之指针-指针为数量----成立
指针+指针------不成立

C和C++中源代码级对存储数据的访问有两种方法:按名字和按指针----就象在大街上按名字(类似变量名)或按门牌号(类似地址)访问商店一样。
酱油党 2012-08-02
  • 打赏
  • 举报
回复
区别大了,在java中只能用数组的形式体现输入输出的概念
在C中可以有指针
在C++中可以有指针和引用
而且在函数调用过程中指针的好处传递的是地址,只在函数堆栈中占用了四个字节,如果是结构体直接传入,
天知道是多少
而引用,你可以把它当成别名,虽然函数堆栈的开销存在,但是木有数据拷贝的开销
当然要是在PC上简单应用以上的意义不大
baichi4141 2012-08-02
  • 打赏
  • 举报
回复
指针内保存的是内存地址
指针有类型,对指针进行解引用操作可以将指针内的内存地址的二进制数据作为指针对应的类型来操作

本质上就是这么简单
Xomic 2012-08-02
  • 打赏
  • 举报
回复
你都 四个 裤衩了,还问这么低级的问题啊!你的裤衩哪来的?我不解...
MC_LoveX 2012-08-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

本质没什么区别…… 值传递和指针传递本质都是值传递
[/Quote]
+1
wshn13 2012-08-02
  • 打赏
  • 举报
回复
本质没什么区别…… 值传递和指针传递本质都是值传递
赵4老师 2012-08-02
  • 打赏
  • 举报
回复
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
free13142006 2012-08-02
  • 打赏
  • 举报
回复
指针与数组的关系密不可分的,它可以指向数据的首地址,从而操作每个数组的元素。而它本身在win32系统上只占用四个字节。而且它可以直接对内存进行操作,效率较高。而很多变量,占用内存空间多,而且变量大多数时候不能直接对应内存地址,效率较慢。
cbzjzsb123 2012-08-02
  • 打赏
  • 举报
回复
区别不大,主要区别在于指针变量本身都是占四个字节的内存,指针变量内存放到是指向的内存单元的地址,是unsigned int 类型的,而普通变量存放的是数据,根据不同的类型存放不同的数据。
自信男孩 2012-08-02
  • 打赏
  • 举报
回复
区别不大,主要区别在于指针变量本身都是占四个字节的内存,指针变量内存放到是指向的内存单元的地址,是unsigned int 类型的,而普通变量存放的是数据,根据不同的类型存放不同的数据。
zhai__chi 2012-08-02
  • 打赏
  • 举报
回复
主要是实现方式不同,效率不同
DBFNO 2012-08-02
  • 打赏
  • 举报
回复
1、传递参数时:对于指针,&p传递的是指针的地址
p传递的是指针所指的变量的地址,也就是变量的地址。

2、int *p 和 int p有什么区别
int p和int *p在为函数传参时,对于int p,只传递它的副本,在函数内部改变p的值不能改变
p在函数外面的值。

而对于*p,可以通过*p=X,来改变它之前所指元素的值,函数外边的值也改变。
例如 int *p,a=4; p = &a; fn(p){*p = 5;} 则调用函数后,a=5。
小小水滴 2012-08-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
1+2这个表达式永远得值3
a+b这个表达式只依赖于a,b的值-----按名字访问称为直接访问
*p + *q 这个表达式的值随着p,q指向的变量不同而不同----按指针访问称为间接访问

直接代表简单----用枪剌只能剌到对手的正面
间接代表灵活----用三截棍却能打到对手的背面
[/Quote]

没什么本质区别,只是类型问题,有的地方需要传递指针,有时需要传递变量,都是值传递,视情况而定

65,179

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧