变量与指针 --- WalMart 寄存箱设计者不懂计算机
一、场景:
今天星期天,难得公司售后同事很给力,项目运行正常,无运维事务需要处理。于是满足堂客(湖南人称老婆)很久来的心愿 陪其逛街(这里要惭愧 检讨作为IT码农常常容易忽略身边的人。大声疾呼:“码农的老婆永远是最伟大的!!!”)。除了老婆 还有 老婆的一位女同事。各种服装店的逛,买鞋子 试衣服,女人对这些事情总是乐在其中。而陪同的我只能强颜应付:“老公这个怎么样”,“恩,不错”。问:“老公这个我穿合适不”,答:“恩,挺好的”。
收拾了战利品(老婆和她同事,都好四五个袋子的搁我这提着)。下一个目标沃尔玛超市逛吃的,和买明后天的菜。可来到超市被无情的拒之门外,手上东西需要寄存。只能同意,便来到了寄存的地方。好家伙大超市就是不一样好大一面墙的寄存箱子。手头上提的东西阁一个箱子肯定存不下,于是挤着分成了四个寄存箱子放。一个一个的放,一个一个寄存条的出。一口气四个全放完,四张寄存条拽在手里。

突然程序员的思想用上脑门,这寄存箱的设计肯定不是程序员设计的,变量竟然连数据类型都没有,存储空间都是单字节的存储。存个地址非得让一个一个的存。唉 没文化真可怕。好咯这样设计就这样咯,我也只能拽着四个变量到处走了。那万一四张丢了一张可怎么是好?? 程序员的惯性思维涌上来。对呀,用指针呀。 再申请一个寄存箱子,然后把这四张寄存扔到一个箱子里。这样一来只要拿着这个指针变量就行了。不会再有丢失的顾虑了。 完成! 心理偷着乐--“会程序真好”。
“老公!! 木头啦 赶紧放好东西走呀”。这会有跟着老婆后面推着购物车,蔬菜,水果,牛奶,肉内,好一顿买好,终于结账走人。 这是拿着指针去取东西。显示打开指针取地址,在根据地址去一个一个的取东西。好一统折腾终于取出来了。转眼一看老婆人呢?? 。。。。。老婆等等我呀!!!
嗨,真正的想陪老婆逛一次街,完成她的一次心愿,无奈又变成了一次程序设计的实际考量。罪过,罪过!
罪过了以后还是得总结,回顾下程序设计的 两个重要内容 c 语言的变量 与 指针
二、变量:
变量就是程序对虚拟内存的一种 “直接引用”
int a;
a = ;
上面代码就是定义了一个变量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=;
p=&a;
printf("%d",a);
p = ;// 一不小心少了个*
printf("%d",a);
上面的代码 p 本身应该是赋予变量存储地址,却赋成了常量3,当然是非法的内存地址。所有直接回中断性的错误。
2、指针与数组名
int i,a[]={,,,,,,,,,};
for (i=;i<=;i++)
{
printf("%d",a[i]);
printf ( "%d", *(a+i) );
}
两次的输出结果完全一样,再看代码
int i,*pa,a[]={,,,,,,,,,};
pa =a ;//请注意数组名a直接赋值给指针 pa
for (i=;i<=;i++)
{
printf ( "%d", pa[i] );
printf ( "%d", *(pa+i) );
}
看pa=a即数组名赋值给指针,以及通过数组名、指针对元素的访问形式看,它们并没有什么区别,从 这里可以看出数组名其实也就是指针。难道它们没有任何区别?
3、指针与数组名区别
int i,*pa,a[]={,,,,,,,,,};
pa =a;
for (i=;i<=;i++)
{
printf ( "%d", *pa );
pa++ ; //注意这里,指针值被修改
}
可以看出,这段代码也是将数组各元素值输出。不过,你把{}中的pa改成a试试。你会发现程序编译 出错,不能成功。看来指针和数组名还是不同的。其实上面的指针是指针变量,而数组名只是一个指针 常量。这个代码与上面的代码不同的是,指针pa在整个循环中,其值是不断递增的,即指针值被修改了 。数组名是指针常量,其值是不能修改的,所以变量指针pa与数组名a可以互换。
四、总结
似乎感觉还有些东西没写完,天色已晚,无赖明天需要上班。敲键盘的声音也影响了堂客的休息,echsong c语言停留在浅薄卖弄水平,只能霍霍到这里。愿你指点。
变量与指针 --- WalMart 寄存箱设计者不懂计算机的更多相关文章
- go之变量、指针、引用地址
一.值类型 定义和说明 定义:变量直接指向存在内存中的值,我们称之为值类型. 值类型的变量的值存储在栈中. 值类型 将一个变量赋值给另一个变量 被称为值拷贝 实例 package main impor ...
- C语言函数指针变量和指针函数以及指针数组
C语言中,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址.我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数.然后通过指针变量就可以找到并调用这 ...
- 从汇编看c++中指向成员变量的指针(二)
在从汇编看c++中指向成员变量的指针(一)中讨论的情形没有虚拟继承,下面来看看,当加入了虚拟继承的时候,指向成员变量的指针有什么变化. 下面是c++源码: #include <iostream& ...
- 从汇编看c++中指向成员变量的指针(一)
在c++中,指向类成员变量的指针存储的并不是该成员变量所在内存的地址,而仅仅是该成员变量在该类对象中相对于对象首地址的偏移量.因此,它必须绑定到某一个对象或者对象指针上面,这里的对象和对象指针,就相当 ...
- C语言基础知识点整理(函数/变量/常量/指针/数组/结构体)
函数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ...
- Android For JNI(三)——C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值
Android For JNI(三)--C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值 C中比较难的这一块,大概就是指针了,所以大家还是多翻阅一下资料,当然,如果只是想了解一下,看本篇 ...
- C语言中数组变量和指针变量
指针变量为什么需要类型? 数组变量和指针变量在使用sizeof时不同,sizeof(数组变量)是数组长度,sizeof(指针变量)是存储int的字节长度4或者8(64bit). 数组变量在参数传递中, ...
- C语言 指向结构体变量的指针
一个指向变量的指针表示的是占内存中起始位置 一个指向结构体的变量的指针表示的是这个结构体变量占内存中的起始位置,同样它也可以指向结构体变量数组 定义结构体变量的指针: //假设已有一个结构体名为Stu ...
- C/C++中指向结构体变量的指针,调用指向的那个结构体中的成员
设p是指向结构体变量的指针,则可以通过以下的方式,调用指向的那个结构体中的成员: (1)结构体变量.成员名.如,stu.num. (2)(*p).成员名.如,(*p).num. (3)p->成员 ...
随机推荐
- HDU 2139 Calculate the formula
http://acm.hdu.edu.cn/showproblem.php?pid=2139 Problem Description You just need to calculate the su ...
- 【SSH】——封装参数不确定的分页查询
[前言] 在BS中,分页技术的应用相当频繁.说到分页,简单的分页就很好实现了,如果在分页的基础上再加上业务逻辑,这就使得分页的技术更加的灵活了. [简单分页] 我们先看一种简单的分页,为了做到复用,我 ...
- Visual Studio 2012,创建工程Build Driver,基于纯Source Code.
拿到一堆纯代码,怎么去Create Project,设置Include路径,lib路径,要不要Pre-compile技术,配置Project之间的依赖关系. SourcesConverter Bas ...
- Flink之状态之checkpointing
1.前言 在Flink中,函数和操作符都可以是有状态的.在处理每个消息或者元素时,有状态的函数都会储存信息,使得状态成为精密操作中关键的组成部分. 为了使状态能够容错,Flink会checkpoint ...
- Java堆和栈
栈中存基本类型变量数据和对象的引用 堆中存new的对象
- 前端工程师必须要知道的SEO技巧(2):制作比设计还要漂亮的代码(内容和语义化代码)实现下
提醒自己:上一篇文章属于纯理论的文章,我自己有的部分之从网上摘抄的,我自己也是不理解的.或许过一段日子我就能全明白了.我自己还是喜欢实战,做几个例子就明白了. 怎么做让自己网页的标签来实现语义化,我直 ...
- 【学习笔记】Learning OpenCV3——Ch8 working with video
Reading Video with the cv::VideoCapture Object 对象创建的三种方法: // 1. Input filename cv::VideoCapture::Vid ...
- [codeforces/gym/100431/E]KMP关于border的理解
题目链接:http://codeforces.com/gym/100431/ 考虑到对于一个串β,能cover它的最短的α必然是它的border的某个前缀,或者是这个β本身. 所谓border,就是n ...
- Leetcode 45. Jump Game II(贪心)
45. Jump Game II 题目链接:https://leetcode.com/problems/jump-game-ii/ Description: Given an array of non ...
- HDU3605:Escape(状态压缩+最大流)
Escape Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...