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/编程

相关文章
相关标签/搜索