变量与指针 --- 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->成员 ...
随机推荐
- web相关基础知识2
2017-12-14 17:14:22 块元素 典型代表,Div,h1-h6,p,ul,li 特点: ★独占一行 ★可以设置宽高 ★ 嵌套(包含)下,子块元素宽度(没有定义情况下)和父块元素宽度默认 ...
- PAT 1005 继续(3n+1)猜想
https://pintia.cn/problem-sets/994805260223102976/problems/994805320306507776 卡拉兹(Callatz)猜想已经在1001中 ...
- Bootstrap中的Affix插件
我们为什么要用bootstrap?因为懒!哦....不,是因为方便,呃...意思差不多. 今天来说说Affix这个插件,它可以使导航栏固定,免去了自己手写的麻烦,用着非常方便,废话不多说,下面是用法. ...
- 【CF MEMSQL 3.0 E. Desk Disorder】
time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...
- 第五届华中区程序设计邀请赛暨武汉大学第十四届校赛 网络预选赛 A
Problem 1603 - Minimum Sum Time Limit: 2000MS Memory Limit: 65536KB Total Submit: 564 Accepted: ...
- inflate
LayoutInflater是用 来找res/layout/下的xml布局文件,并且实例化 https://www.cnblogs.com/savagemorgan/p/3865831.html
- GTK+与MFC不完全对比
转载自:http://tech.ddvip.com/2007-11/119640973738229.html 1. 两者都是基于面向对象设计的.尽管MFC是用C++写的,而GTK+是用C写的,但思想都 ...
- php函数-shuffle
Shuffle()函数说明: -随机乱序现有数组并不保留键值: -shuffle()函数把数组中的元素按随机顺序重新排列,该函数为数组中的元素分配新的键名,已有键名将被删除. 语法说明: shuffl ...
- a 标签中 title 属性样式修改
无文字描述,直接上测试页,看效果. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...
- Spring学习--集合属性
Spring 中可以通过一组内置的 xml 标签(例如: <list> , <set> 或 <map>) 来配置集合属性. 配置java.util.Set 需要使用 ...