C语言指针、地址、赋值三者含义
先来一个观点.大家先看看对不对
按:在CSDN论坛上,有位坛友提到这个问题:
====================================
先看一段代码:
#include<stdio.h>
void main()
{
int*p=10;
printf("%d",p);
}
看 看上述代码有什么问题没有?相信清楚指针概念的各位知道,int*p其实划分来看是(int*)p,他其实是一个指针,那么int*p=10;等价于 int*p;p=10;,大家都知道,指针就是地址,前面语句的意思是,把常量10的值赋给指针p,按照定义来说,这是不合法的,因为常量不能直接赋值给 指针,比如int a=10;int*p=&a;这才是合法的。但是我通过VC6.0编译器编译一下,文件名为al.C(注意了,非CPP后缀),结果编译器毫不报 错;输出结果为10。
====================================
看了这位坛友的帖子,实在令人担忧呀……
首先,您(称呼这位坛友)说“按照定义来说,这是不合法的,因为常量不能直接赋值给指针”。
哪里有这个“定义”呀?
我慢慢说……到后来,您就会知道,您的这种“定义”是毫无意义的。
先说啥是指针。
您说“大家都知道,指针就是地址”。这种说法是错误的(且害人的)。用这种思路去理解指针,那说明您还没有体会到,关于指针的许多真实情况。
“地址”这个观念,是为了让那些需要向存储器中的某个或某些存储单元进行数据存取的主体(比如处理器)能够找到这些存储单元,而引入的。
显然地,在这些主体看来,那些存储单元的位置(即地址),也是数据。那么,这后一种数据,也要在存储器中被存储、被读写。(从C语言编程语境来看, 这后一种数据的符号,就是指针变量或指针常量的符号。)
而“指针”这个观念的引入,与“地址”的比起来,要复杂一些,或者说,前者的用途与意义更具多样性:
(1)指针变量或指针常量的值,往往可以由一个取地址符(&)作用在一个变量或常量的符号上而获得。
如果您要说“指针的值,不能取常量的地址”的话,那您又错了。如下写法,就可以令指针取到常量的地址:
int const a=12345;
int const *pa=&a;
或
int const a=12345;
int const *pa;
pa=&a;
从这个角度看来,指针的用途和意义在于:获取程序中变量或常量符号实际对应于存储器的数据的位置。
那么,对于同一个指针量,可以随程序员的意愿,在任何时候,获取任何既有的符号所对应的数据的位置,作为它的值 —— 不过,这里有一个极不可忽略的条件,下面会讲。
地址,则没有上述的意义和用途。一个符号所对应的数据,在存储器中的位置,在符号被声明的当初,就任由老Boss来分配。这个分配过程,对于程序员来说,是透明的 —— 这是高级语言与低级语言之间的一个显著区分。但由于C语言里存在着“指针”这个机制,就使得它“高级得不那么彻底” —— 因为,程序员可以透过指针,来窥探到老Boss和他的存储器情人是怎么约会的。
(2)指针量的值,除了由上面第(1)点中所说的方式获得之外,还可以由第(1)点中的方式所获得的量,再加加减减,即进行所谓“指针运算”来被赋予。让函数返回一个“实用的”存储器中的位置值,通常就是属于这一类。
(3)在第(1)点的例子里,我们已经看到:在声明指针量符号的时候,必须必须同时给出某种数据类型。这个数据类型必须必须,跟这个指针将来要指向的符号在被声明时所设置的数据类型,完全一致!
如果差那么一点儿,但尚在老Boss的理解范围之内的话,那么,老Boss会骂一句(吐出一个Warning),然后他会心不服但手服地,为指针量赋值等号右边的东西,做一些强制的转换。
但是如果差得比较离谱了,老Boss就索性罢工了。
在这位坛友的例子中:
int*p=10;
就是属于前一种的“差那么一点儿”的情况。这时候,虽然老Boss没有罢工(没有编译error),但是您不知道,他已经有一些怨气地在暗地里,为您做了一些事情。如果您打开Warning选项,就能听到他的骂声。(千万不要以为“编译通过,程序就是写得100%合乎标准的”!)
如果您把上面的代码,改写成这样:
int *p=(int *)10;
那么,保证老Boss不会骂您、更不会罢工。
上面这样写是什么意思呢?原来您的写法,是把一个整数10赋予了指针量p。我们姑且认为这个10就是整数常量。其实,不管这个10是个啥量啥类型,只要前面顶上一个“(int *)”,它就会被老Boss强制转换为:符号p在声明时所设置的那个类型(即指向整数类型变量的指针)。
我为什么说“不管这个10是个啥量啥类型”呢?
您看:
int *p=(int *)'a';
就是如此,老Boss也不会骂人或罢工。
致谢原文:http://www.douban.com/group/topic/30597081/
C语言指针、地址、赋值三者含义的更多相关文章
- 09C语言指针
C语言指针 地址 地址就是数据元素在内存中的位置表示: &变量名 #include <stdio.h> int main(){ int aa; unsigned int bb = ...
- C语言指针的初始化和赋值
1.指针的初始化 指针初始化时,"="的右操作数必须为内存中数据的地址,不能够是变量,也不能够直接用整型地址值(可是int*p=0;除外,该语句表示指针为空).此时,*p仅仅是表示 ...
- C语言指针的使用例子(1)指针地址的输出
#include <stdio.h> int main(void) { int a=10; int *p = &a; *p = 89; printf("变量值a=%d a ...
- C语言指针总结
C语言中的精华是什么,答曰指针,这也是C语言中唯一的难点. C是对底层操作非常方便的语言,而底层操作中用到最多的就是指针,以后从事嵌入式开发的朋友们,指针将陪伴我们终身. 本文将从八个常见的方面来透视 ...
- C程序设计语言--指针和引用的区别
在看了一篇文章以后,http://coolshell.cn/articles/7992.html,说的是C和C++之间的缺陷,当然这篇文章说的非常高深了.所以就找了一些资料,分析了这两者的区别 在&l ...
- C语言指针和数组知识总结(上)
C语言指针和数组知识总结(上) 一.指针的基础 1.C语言中,变量的值能够通过指针来改变,打印指针的语句符号可以是: %08x 2.指针的本质 指针的本质就是变量,那么既然是变量,那么一定会分配地址 ...
- 彻底搞定C语言指针(精华版)
1.语言中变量的实质 要理解C指针,我认为一定要理解C中“变量”的存储实质, 所以我就从“变量”这个东西开始讲起吧! 先来理解理解内存空间吧!请看下图: 内存地址→ 6 7 8 9 10 11 12 ...
- C语言指针【转】
一.C语言指针的概念 在计算机中,所有的数据都是存放在存储器中的.一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元等,在前面已有详细 ...
- C语言指针的陷阱
C语言指针的陷阱 分类: C/Cpp 转自:http://blog.csdn.net/porscheyin/article/details/3461670 “C语言诡异离奇,陷阱重重,却获得了巨大 ...
随机推荐
- WCF、Web API、WCF REST、Web Service
WCF.Web API.WCF REST.Web Service 区别 Web Service It is based on SOAP and return data in XML form. It ...
- 使用POI导出excel
引言:对于excel的导出,首先是将数据写到WorkBook中,然后将book以流的形式写出即可,看代码: public void exportResultInfo(String fileName,S ...
- 13个不可不知的ASP.NET MVC扩展点
13个不可不知的ASP.NET MVC扩展点 ASP.NET MVC设计的主要原则之一是可扩展性.处理管线(processing pipeline)上的所有(或大多数)东西都是可替换的.因此,如果您不 ...
- IOS7学习之路一(新UI之自定义UITableViewCell)
ios7 新升级之后界面有了很大的变化,xcode模拟器去掉了手机边框和home键,如果想回到主页面,可以按住shift+comment+r键.废话少说先展示一下新UI下UItableView设置为G ...
- EasyUI项目驱动学习
下面以一个项目简单介绍easyui的使用,主要包括以下组件 布局面板 - layout 可伸缩面板 - accordion 选项卡 - tabs 控制面板 - panel 窗口 - window 对话 ...
- 【C#】Smtp发送邮件
class SmtpEmail { SmtpClient smtpclient; MailMessage msg; Attachment attachment; public void sendMai ...
- IceMx.Mvc 我的js MVC 框架七、完善植物大战僵尸(增加阳光的消费和获得)
话不多说,先上图 这次增加了阳光的消费和获得,增加了阳光的点击动画 重新排布了布局 有兴趣的话就研究下吧. 上一篇有朋友说让我把项目放到github上面维护,本人没用过这个,肯请朋友们帮小弟科普一下放 ...
- .NET自带IOC
.NET自带IOC 本文主要把MEF作为一种IOC容器进行讲解,.net中可用的IOC容器非常多,如 CastleWindsor,Unity,Autofac,ObjectBuilder,Structu ...
- 【总结】AngularJs学习总结
应项目的需要,一个月之前开始做WebComponents.Javascript MVC框架的技术调研,由于重点是想做组件化,所以就没有考虑Backbone(去年就小试牛刀,太难用了)及其他的mvc框架 ...
- Visual Studio 2012的开发使用技巧
分享10条Visual Studio 2012的开发使用技巧 使用Visual Studio 2012有一段时间了,并不是追赶潮流,而是被逼迫无可奈何.客户要求的ASP.NET MVC 4的项目,要用 ...