变量与指针 --- 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->成员 ...
随机推荐
- 关于word文档中目录的switch
有很多的switch,下面这篇文章介绍的比较详细,可以参考:http://word.mvps.org/FAQs/Formatting/TOCSwitches.htm
- java生成和解析二维码
前言 现在,二维码的应用已经非常广泛,在线生成器也是诸多,随手生成. 所以就和大家分享一个小案例,用zxing来做一个的二维码生成器,当然这个例子是比较简单,若是写的不好请多多包涵. ZXING项目是 ...
- [BinaryTree] 二叉搜索树(二叉查找树、二叉排序树)
二叉查找树(BinarySearch Tree,也叫二叉搜索树,或称二叉排序树BinarySort Tree)或者是一棵空树,或者是具有下列性质的二叉树: (1)若它的左子树不为空,则左子树上所有结点 ...
- oracle分区技术提高查询效率
概述: 当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区.表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件 ...
- BZOJ4448 SCOI2015情报传递(离线+树链剖分+树状数组)
即滋磁单点修改,询问路径上小于某数的值有多少个.暴力树剖套个主席树(或者直接树上主席树,似乎就1个log了?感觉不一定比两个log快)即可,然而不太优美. 开始觉得可以cdq,然而就变成log^3了. ...
- 机器学习模型-支持向量机(SVM)
二.代码实现 import numpy as np from sklearn import datasets from sklearn.model_selection import train_tes ...
- BZOJ1057 [ZJOI2007]棋盘制作 【最大同色矩形】
1057: [ZJOI2007]棋盘制作 Time Limit: 20 Sec Memory Limit: 162 MB Submit: 3248 Solved: 1636 [Submit][St ...
- 【NOIP2017 D1 T1 小凯的疑惑】
题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有 无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的.现在小 凯想知道在无法准确支付的物品中,最贵的 ...
- [USACO Hol10] 臭气弹 图上期望概率dp 高斯
记住一开始和后来的经过是两个事件因此概率可以大于一 #include<cstdio> #include<iostream> #include<cstdlib> #i ...
- 前缀统计 [Trie]
前缀统计 描述 给定N个字符串S1,S2...SN,接下来进行M次询问,每次询问给定一个字符串T,求S1-SN中有多少个字符串是T的前缀.输入字符串的总长度不超过10^6,仅包含小写字母. 输入格式 ...