仓酷云

标题: 来看看:C言语指针5分钟教程 [打印本页]

作者: 因胸联盟    时间: 2015-1-16 11:05
标题: 来看看:C言语指针5分钟教程
对于linux命令,一定要学会用man和info去查他们的解释;
  指针、援用和取值

  甚么是指针?甚么是内存地点?甚么叫做指针的取值?指针是一个存储盘算机内存地点的变量。在这份教程里“援用”暗示盘算机内存地点。从指针指向的内存读取数据称作指针的取值。指针能够指向某些详细范例的变量地点,比方int、long和double。指针也能够是void范例、NULL指针和未初始化指针。本文会对上述一切指针范例举行切磋。
  依据呈现的地位分歧,操纵符*既能够用来声明一个指针变量,也能够用作指针的取值。当用在声明一个变量时,*暗示这里声了然一个指针。别的情形用到*暗示指针的取值。
  &是地点操纵符,用来援用一个内存地点。经由过程在变量名字前利用&操纵符,我们能够失掉该变量的内存地点。
  1. //声明一个int指针int*ptr;//声明一个int值intval=1;//为指针分派一个int值的援用ptr=&val;//对指针举行取值,打印存储在指针地点中的内容intderef=*ptr;printf("%d
  2. ",deref);
复制代码
  第2行,我们经由过程*操纵符声了然一个int指针。接着我们声了然一个int变量并赋值为1。然后我们用int变量的地点初始化我们的int指针。接上去对int指针取值,用变量的内存地点初始化int指针。终极,我们打印输入变量值,内容为1。
  第6行的&val是一个援用。在val变量声明并初始化内存以后,经由过程在变量名之前利用地点操纵符&我们能够间接援用变量的内存地点。
  第8行,我们再一次利用*操纵符来对该指针取值,可间接取得指针指向的内存地点中的数据。因为指针声明的范例是int,以是取到的值是指针指向的内存地点存储的int值。
  这里能够把指针、援用和值的干系类比为信封、邮箱地点和屋子。一个指针就仿佛是一个信封,我们能够在下面填写邮寄地点。一个援用(地点)就像是一个邮件地点,它是实践的地点。取值就像是地点对应的屋子。我们能够把信封上的地点擦失落,写上别的一个我们想要的地点,但这个举动对屋子没有任何影响。



  void指针、NULL指针和未初始化指针

  一个指针能够被声明为void范例,好比void*x。一个指针能够被赋值为NULL。一个指针变量声明以后但没有被赋值,叫做未初始化指针。
  1. int*uninit;//int指针未初始化int*nullptr=NULL;//初始化为NULLvoid*vptr;//void指针未初始化intval=1;int*iptr;int*castptr;//void范例能够存储恣意范例的指针或援用iptr=&val;vptr=iptr;printf("iptr=%p,vptr=%p
  2. ",iptr,vptr);//经由过程显现转换,我们能够把一个void指针转成//int指针并举行取值castptr=(int*)vptr;printf("*castptr=%d
  3. ",*castptr);//打印null和未初始化指针printf("uninit=%p,nullptr=%p
  4. ",uninit,nullptr);//不晓得你会失掉如何的前往值,会是随机的渣滓地点吗?//printf("*nullptr=%d
  5. ",nullptr);//这里会发生一个段毛病//printf("*nullptr=%d
  6. ",nullptr);
复制代码
  实行下面的代码,你会失掉相似上面对应分歧内存地点的输入。
  1. iptr=0x7fff94b89c6c,vptr=0x7fff94b89c6c*castptr=1uninit=0x7fff94b89d50,nullptr=(nil)
复制代码
  第1行我们声了然一个未初始化int指针。一切的指针在赋值为NULL、一个援用(地点)大概另外一个指针之前都是未被初始化的。第2行我们声了然一个NULL指针。第3行声了然一个void指针。第4行到第6行声了然一个int值和几个int指针。
  第9行到11行,我们为int指针赋值为一个援用并把int指针赋值为void指针。void指针能够保留各类别的指针范例。年夜多半时分它们被用来存储数据布局。能够注重到,第11行我们打印了int和void指针的地点。它们如今指向了一样的内存地点。一切的指针都存储了内存地点。它们的范例只在取值时起感化。
  第15到16行,我们把void指针转换为int指针castptr。请注重这里必要显现转换。固然C言语其实不请求显现地转换,但如许会增添代码的可读性。接着我们对castptr指针取值,值为1。
  第19行十分成心思,在这里打印未初始化指针和NULL指针。值得注重的是,未初始化指针是有内存地点的,并且是一个渣滓地点。不晓得这个内存地点指向的值是甚么。这就是为何不要对未初始化指针取值的缘故原由。最好的情形是你取到的是渣滓地点接上去你必要对程序举行调试,最坏的情形则会招致程序溃散。
  NULL指针被初始化为o。NULL是一个特别的地点,用NULL赋值的指针指向的地点为0而不是随机的地点。只要当你筹办利用这个地点时无效。不要对NULL地点取值,不然会发生段毛病。
  指针和数组

  C言语的数组暗示一段一连的内存空间,用来存储多个特定范例的工具。与之相反,指针用来存储单个内存地点。数组和指针不是统一种布局因而不成以相互转换。而数组变量指向了数组的第一个元素的内存地点。
  一个数组变量是一个常量。即便指针变量指向一样的地点大概一个分歧的数组,也不克不及把指针赋值给数组变量。也不成以将一个数组变量赋值给另外一个数组。但是,能够把一个数组变量赋值给指针,这一点仿佛让人感应隐晦。把数组变量赋值给指针时,实践上是把指向数组第一个元素的地点赋给指针。
  1. intmyarray[4]={1,2,3,0};int*ptr=myarray;printf("*ptr=%d
  2. ",*ptr);//数组变量是常量,不克不及做上面的赋值//myarray=ptr//myarray=myarray2//myarray=&myarray2[0]
复制代码
  第1行初始化了一个int数组,第2行用数组变量初始化了一个int指针。因为数组变量实践上是第一个元素的地点,因而我们能够把这个地点赋值给指针。这个赋值与*ptr=&myarray[0]效果不异,显现地把数组的第一个元素地点赋值到了ptr援用。这里必要注重的是,这里指针必要和数组的元素范例坚持分歧,除非指针范例为void。
  指针与布局体

  就像数组一样,指向布局体的指针存储了却构体第一个元素的内存地点。与数组指针一样,布局体的指针必需声明和布局体范例坚持分歧,大概声明为void范例。
  1. structperson{intage;char*name;};structpersonfirst;structperson*ptr;first.age=21;char*fullname="fullname";first.name=fullname;ptr=&first;printf("age=%d,name=%s
  2. ",first.age,ptr->name);
复制代码
  第1至6行声了然一个person布局体,一个变量指向了一个person布局体和指向person布局体的指针。第8举动age成员赋了一个int值。第9至10行我们声了然一个char指针并赋值给一个char数组并赋值给布局体name成员。第11行我们把一个person布局体援用赋值给布局体变量。
  第13行我们打印了却构体实例的age和name。这里必要注重两个分歧的标记,’.’和‘->’。布局体实例能够经由过程利用‘.’标记会见age变量。关于布局体实例的指针,我们能够经由过程‘->’标记会见name变量。也能够一样经由过程(*ptr).name来会见name变量。
  总结

  但愿这份冗长的概述可以有助于懂得分歧的指针范例。在后续的博文中我们会切磋别的范例的指针和初级用法,好比函数指针。
  接待提出发问并给出批评。
  原文链接:DennisKubes翻译:伯乐在线-唐尤华
  译文链接:http://blog.jobbole.com/25409/
如果你学不好的话,你在linux中开发的机会就很少,或者说几乎没有,它的优势就消失了,然后随着时间的流逝,你就会全部忘记她;
作者: 海妖    时间: 2015-1-18 07:47
现在的年轻人,清一色的追求看书看国外教材,当然我也不能低人一个档次,看的都是有名的大师作品,不期自己能够编出惊天地泣鬼神的大作。
作者: 小妖女    时间: 2015-1-26 12:53
当然. 你有兴趣可以再学学动态语言.比如 Ruby.慢慢地. 就会提高的.多学一点东西.就会让你的思维广阔。。
作者: 兰色精灵    时间: 2015-2-4 19:06
C++是门博大精深的编程语言,可以说它是其他很多语言的基础,我现在接触到的语言都是C的翻版或者衍生,所以学好它还是相当重要的。
作者: 小女巫    时间: 2015-2-10 06:05
关于C++中string和vector的使用,在C++的规范标准之后,正式提出了标准库类型string和vector。
作者: 爱飞    时间: 2015-3-1 00:48
确实如此,你让一个使用惯C++的人看你在程序中夹杂些诸如 printf(),scanf(),这些原本就很简单的函数,实在有些过分,一个cout直接就很清晰的输出语句,被搞得又是变量类型,又是变量名称。
作者: 若天明    时间: 2015-3-10 11:55
也就是面向对象的基本原理..这不仅在复杂的语法上, 而且还有就是怎么样用这种语言来表达\\\\\\\\\\\\\\\"面向对象\\\\\\\\\\\\\\\"
作者: 若相依    时间: 2015-3-17 07:09
确实如此,你让一个使用惯C++的人看你在程序中夹杂些诸如 printf(),scanf(),这些原本就很简单的函数,实在有些过分,一个cout直接就很清晰的输出语句,被搞得又是变量类型,又是变量名称。
作者: 仓酷云    时间: 2015-3-24 02:06
天将降大任与斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,.......理解得人自然会在心中默念,不理解得会笑我土。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2