变量与指针 --- WalMart 寄存箱设计者不懂计算机

一、场景:

  今天星期天,难得公司售后同事很给力,项目运行正常,无运维事务需要处理。于是满足堂客(湖南人称老婆)很久来的心愿 陪其逛街(这里要惭愧 检讨作为IT码农常常容易忽略身边的人。大声疾呼:“码农的老婆永远是最伟大的!!!”)。除了老婆  还有 老婆的一位女同事。各种服装店的逛,买鞋子 试衣服,女人对这些事情总是乐在其中。而陪同的我只能强颜应付:“老公这个怎么样”,“恩,不错”。问:“老公这个我穿合适不”,答:“恩,挺好的”。

  收拾了战利品(老婆和她同事,都好四五个袋子的搁我这提着)。下一个目标沃尔玛超市逛吃的,和买明后天的菜。可来到超市被无情的拒之门外,手上东西需要寄存。只能同意,便来到了寄存的地方。好家伙大超市就是不一样好大一面墙的寄存箱子。手头上提的东西阁一个箱子肯定存不下,于是挤着分成了四个寄存箱子放。一个一个的放,一个一个寄存条的出。一口气四个全放完,四张寄存条拽在手里。

  

  突然程序员的思想用上脑门,这寄存箱的设计肯定不是程序员设计的,变量竟然连数据类型都没有,存储空间都是单字节的存储。存个地址非得让一个一个的存。唉 没文化真可怕。好咯这样设计就这样咯,我也只能拽着四个变量到处走了。那万一四张丢了一张可怎么是好?? 程序员的惯性思维涌上来。对呀,用指针呀。 再申请一个寄存箱子,然后把这四张寄存扔到一个箱子里。这样一来只要拿着这个指针变量就行了。不会再有丢失的顾虑了。 完成! 心理偷着乐--“会程序真好”。

  

  “老公!! 木头啦 赶紧放好东西走呀”。这会有跟着老婆后面推着购物车,蔬菜,水果,牛奶,肉内,好一顿买好,终于结账走人。 这是拿着指针去取东西。显示打开指针取地址,在根据地址去一个一个的取东西。好一统折腾终于取出来了。转眼一看老婆人呢?? 。。。。。老婆等等我呀!!!

  

  嗨,真正的想陪老婆逛一次街,完成她的一次心愿,无奈又变成了一次程序设计的实际考量。罪过,罪过!

  

  罪过了以后还是得总结,回顾下程序设计的 两个重要内容 c 语言的变量 与 指针

  

二、变量:

  变量就是程序对虚拟内存的一种 “直接引用”

  

int a;
a = 2;

 上面代码就是定义了一个变量a ,并初始化 2。那么在c 语言里变量包括变量名 和 变量类型。类型名就是用来指明变量在存在空间占几个字节。变量名被系统自动将转换为变量的存储地址(首字节的地址)。(虚拟存储就是类似 沃尔玛的寄存箱,而沃尔玛寄存箱的数据人员显然设计的时候没有设计数据类型。如果设计了一个int类型,那么echsong今天的四个存储箱子完全指需要一个存储条,四个自动放成连续的存储箱。然后保留一个存储条,上面记录第一个个存储箱的编号,然后类型是int。那么拿着这个存储条再来开存储箱的时候一次性就可以开四个。一个变量的存储就能方便客户的多个存储箱的存储)。

三、指针

  在情景总echosong 用了指针的思想。在怕丢失寄存票的情况下。用来一个新的寄存箱来放其他四个寄存箱的寄存票。这里基本上和c语言的指针一样,但是前提在把echsong之前放的那四个寄存箱看做成一个int类型。你们从这里可总结 。指针其实本质也是个变量。他具体的特点是存储内容里面存的是其他变量的地址。而且其变量是带变量类型的。不同的指针应该是存放这不同类型的变量。在c语言里头指针的定义代码如

int *p; // *P就代表是一个里面能够存放int类型变量地址的指针变量
int a; 
p = &a; //把a变量的地址放入p中做为p的存储内容

图中用红圈标准出来的 是因为echosong也不确定 指针到底自身占有几个字节的存储。 大致先认为不同的存储系统是不同的 32位应该是 4个字节(如果有错误请联系echosong)

1、指针的使用

  

int *p;
int a =2;
p=&a;
printf("%d",a);
*p = 3;
printf("%d",a);

上面代码运行得到结果是 2,3。 从此得知p间接的修改了a 的内存内容。也就是说改变*P 就等同于改变a的值。

int *p;
int a=2;
p=&a;
printf("%d",a);
p = 3 ;// 一不小心少了个*
printf("%d",a);

上面的代码 p 本身应该是赋予变量存储地址,却赋成了常量3,当然是非法的内存地址。所有直接回中断性的错误。

2、指针与数组名

int i,a[]={3,4,5,6,7,3,7,4,4,6};
for (i=0;i<=9;i++)
{
    printf("%d",a[i]);
    printf ( "%d",  *(a+i) );

}

两次的输出结果完全一样,再看代码

int i,*pa,a[]={3,4,5,6,7,3,7,4,4,6};
pa =a  ;//请注意数组名a直接赋值给指针 pa
for (i=0;i<=9;i++)
{
printf ( "%d", pa[i] );
printf ( "%d", *(pa+i) );
} 

看pa=a即数组名赋值给指针,以及通过数组名、指针对元素的访问形式看,它们并没有什么区别,从 这里可以看出数组名其实也就是指针。难道它们没有任何区别?

3、指针与数组名区别

int i,*pa,a[]={3,4,5,6,7,3,7,4,4,6};
pa =a;
for (i=0;i<=9;i++)
{
printf ( "%d", *pa );
pa++ ;  //注意这里,指针值被修改
} 

可以看出,这段代码也是将数组各元素值输出。不过,你把{}中的pa改成a试试。你会发现程序编译 出错,不能成功。看来指针和数组名还是不同的。其实上面的指针是指针变量,而数组名只是一个指针 常量。这个代码与上面的代码不同的是,指针pa在整个循环中,其值是不断递增的,即指针值被修改了 。数组名是指针常量,其值是不能修改的,所以变量指针pa与数组名a可以互换。

四、总结

  似乎感觉还有些东西没写完,天色已晚,无赖明天需要上班。敲键盘的声音也影响了堂客的休息,echsong c语言停留在浅薄卖弄水平,只能霍霍到这里。愿你指点。

 

posted @ 2014-01-05 23:47  EchoSong  阅读(1606)  评论(8编辑  收藏  举报