傲世皇朝代理-傲世皇朝代理

  傲世皇朝代理-傲世皇朝代理【主管╇QV:555333】傲世皇朝代理【╇QV:555333】《优_质_平_台《《_《《置_顶_待_遇《《一步到位》》近期俄罗斯的陨石、四月的血月、五月北京的飞雪以及天朝各种血腥和混乱,给人一种不详的预感。佛祖说的末法时期,五浊恶世,十恶之世,人再无心法约束,道德沦丧,和现在正好吻合。尤其是在天朝,空气,水,食品,你能告诉还有没有问题的吗?不知大难至,世人依旧忙。祸福相依,危中有机。那些高级生命,出于慈悲,会救渡我们,但是你要去思考,去发现机缘。最近较闲,没事就学点基础知识,整天在上层晃,感觉晕的厉害,接地气。关于指针我上学的时候学过一点,我的老师说“指针很难呢“,当时以为这老师挺谦虚的。后来才知道其实他想说"我也搞不懂",不懂就别乱比喻的了,把指针比喻成门牌号,信封邮寄地址,现在我看到指针就想起门牌号,信封地址。想想都是泪。

  地址

  说到指针,先说说地址,看一段小程序

  #include"stdio.h"

  int main()

  {

  int a=10;

  int*p=&a;

  printf("%p\n",p);

  return 0;

  }

  //output

  0x7fff8b6a378c

  傲世皇朝代理-傲世皇朝代理【主管╇QV:555333】傲世皇朝代理【╇QV:555333】《优_质_平_台《《_《《置_顶_待_遇《《一步到位》》每当我看到指针的输出像这种"0x7fff8b6a378c"时候,头都大了,那时候老师说是地址,搞得糊里糊涂的。那什么是地址呢?当然我帮你百科一下。是系统RAM中的特定位置,通常以十六进制的数字表示,系统通过这个地址,就可以找到相应的内容。当使用80386时,我们必须区分以下三种不同的地址:逻辑地址、线性地址、物理地址;在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址(偏移地址),不和绝对物理地址相干,比如上面那个"0x7fff8b6a378c"就是逻辑地址。逻辑地址不是被直接送到内存总线,而是被送到内存管理单元(MMU)。MMU由一个或一组芯片组成,其功能是把逻辑地址映射为物理地址,即进行地址转换。下面是转换关系图。

  关于内存地址怎么转换可以参考一下的博文。《再论逻辑地址、线性地址》、《我理解的逻辑地址、线性地址、物理地址和虚拟地址》

  指针

  c语言相比汇编算应该算是高级了,却保留的了操作地址中高效的又抽象的形式。那么指针到底是什么呢?在那本经典《c程序设计语言》是这样描述:”指针是一种保存变量地址的变量“,指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址,指针与地址不要混在一起,指针是存储地址一个变量,地址是内存分配。指针可以指向这个内存地址,也可以指向另一个内存地址,当指针指向一个内存地址,它们之间才发生联系,通过这个指针去操作这块内存,所以指针把我们带入到地址层面去操作数据,在php,java这些高级语言没有这一层的操作。举个例子

  //字符串翻转例子

  #include"stdio.h"

  #include"string.h"

  void revstr(char*);

  int main()

  {

  char str[]="Zhen Shan Ren is good!";

  revstr(str);

  puts(str);

  }

  void revstr(char*str)

  {

  char*start,*end,temp;

  start=str;

  end=start+strlen(str)-1;

  while(start++<end--){

  temp=*start;

  *start=*end;

  *end=temp;

  }

  }

  上面的例子是从指针的角度去处理字符串,我再revstr函数中定义了两个指针,一个指针指向字符串的首地址,另一个指针指向字符串的末地址,把内容互换。指针提供这样便利,可以通过加、减来访问这一块内存。然后再去改变内存的值。如果没有指针,只能去操作这样逻辑地址“0x7fff8b6a378c”去计算下一个或上一个逻辑地址,会不会疯掉呢?所以指针把我们带入到地址层面去操作数据。指针难点是我们不是很清楚有些复杂的数据类型的在内存中存储。指来指去不知道指向那了。如果你能很清楚内存的分布,就不会指错地方!

  指针的几个概念

  1.指针的类型

  基本数据类型比如int、char,还有一些复杂的比如int(*p)[],指向数组的指针,像这种的判断就是指针名字去掉,指针的类型类型就是int(*)[],其实就是指向数组的指针

  2.指针所指向的类型

  当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。

  例如:int*ptr:指针所指向的类型是int int(*ptr)[3]:指针所指向的的类型是int()[3]

  3.指针的值

  我们说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。傲世皇朝代理-傲世皇朝代理【主管╇QV:555333】傲世皇朝代理【╇QV:555333】《优_质_平_台《《_《《置_顶_待_遇《《一步到位》》

猜你喜欢

转载自www.cnblogs.com/zhangweiqing/p/12825025.html