变量与指针 --- 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->成员 ...
随机推荐
- POJ3984(迷宫问题)
定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, ...
- javascript 数组以及对象的深拷贝
如果 let arr2 = arr1: 那么只是赋值的引用,改变arr2也会相应的改变arr1: 如果 let arr2 = [].concat(arr1): 如果arr1里面不是引用类型,那么ar ...
- Git 删除服务器的远程分支
git push origin :分支名 可能会出现,在A机子操作,刷新下成功删除,但在B机子上还显示,再用下命令提示不存在该分支,只要再推送一个任意分支即可正常显示
- 【题解】SDOI2011消耗战
虚树模板题~洛谷P2495 第一次写虚树,感觉好厉害呀~首先,这道题目的树形dp是非常显然的,要控制一个点&其子树所有点,要么在子树内部割边,要么直接切点该点与父亲的连边.所以dp[u]表示控 ...
- 洛谷P3806 【模板】点分治1 【点分治】
题目背景 感谢hzwer的点分治互测. 题目描述 给定一棵有n个点的树 询问树上距离为k的点对是否存在. 输入输出格式 输入格式: n,m 接下来n-1条边a,b,c描述a到b有一条长度为c的路径 接 ...
- NOI2018 D1T1 [NOI2018]归程 解题报告
P4768 [NOI2018]归程 题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 \(n\) 个节点.\(m\) 条边的无向连通图(节点的编号从 \ ...
- 停课day5
一转眼,已经停课五天了. 高二大佬们已经都走了,在机房里面呆着,有时感觉很孤寂. 但是为了能学好竞赛,这些都是在所不惜的. 好像多打打比赛啊,可是cf要FQ,洛谷之类的比赛还不勤. 哎,先去学一发SP ...
- ng websocket
ng使用websocket 1.安装依赖库npm install ws --save 2.安装类型定义文件 npm install @types/ws --save 3.编写服务 import { I ...
- windows10-seaslog安装笔记
1.seasLog在windows下的安装 首先,要下载seasLog的dll文件,下载地址:http://pecl.php.net/package/SeasLog 选择对应你的系统和php版本的d ...
- fs.watch 爬坑
上星期用 fs.watch 和 readline.createInterface 对pm2的合并日志做了监控,根据指定的错误信息重启服务 发现不管是手动vim编辑日志,还是等待日志自动输出. fs.w ...