指针的初始化.docx_第1页
指针的初始化.docx_第2页
指针的初始化.docx_第3页
指针的初始化.docx_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

指针的初始化今天在看代码的时候,在C/C+指针的初始化的问题上查阅了相关的资料。找了些比较有意义的几篇综合一下:csdn一个人对指针和指针初始化的叙述:通俗的讲,指针是一个地址,指针的初始化就是让指针指向一个确定的地址。*是指针的解引用符,意思是取指针指向的地址里的数据。因此,int a;int *p = &a;/ 这里是初始化,表示的是指针初始化为a的地址,实际相当于int *p; p = &a;*p = 10;/ 这是表示对指针解引用,想p所指向的地址写入10从函数调用的角度来讲,一个函数在那里,并不会自己运行,只有你去调用它它才会运行。在函数调用发生时,C/C+实际做的是用实际参数代替形参。例如:void func(int* a) (* a) = 12; /这样操作有无问题?int* p;func(p); / 在这里(函数调用)的时候,实际相当于有如下过程:int *a; a =p;(实参代替形参); *a = 10; 因此,这样操作是否有问题,关键在于p(实参)本身是否有问题。如果p本身指向了一个确切的地址,则a=p也使a(形参)实际指向了一个确切的地址,如果p本身没初始化,那么a=p也使a实际指向了一个未初始化的地址。下面是在一篇博客上讲述的对指针初始化的几种情况:1.一般指针的初始化int *p=1;char *q=a;都是错误的写法,一般应该是int a5,b;int *p=a;int *q=&b;为什么呢?int *P=&a;运算顺序是int *(p=&a)而不是 int (*p)=(&a);一般的初始化指针可以通过以下的一些方法:int *q=0; int *p=NULL;初始化指针变量q,有两个作用,首先会在当前系统堆栈区给q开辟一个随机地址&q,同时将*q(指针q所指向的空间的内容)的值修改为0。具有值NULL的指针不指向任何值。int *p, a;p=&a;或者定义的时候就初始化,或者int *p=&a;2.指针里存放的虽然是地址,而且地址长度是一样的,地址长度是一样的 sizeof(int *) 和 sizeof(char*)在32位机器都是4个字节,但是定义不同类型的指针意义在于程序执行时需要确切地知道如何移动指针,以及如何读取指针所指单元的内容。比如:int a10;int *p = a;现在p指向数组的首地址 假设这个地址是0x00000000,那么*p = a0那么怎么指向a1呢?执行p = p+1后 *p=a1了请注意 p=p+1不是 0x00000000+1而是0x00000000+4(在32位的机器上)为什么是加4而不是加1 因为int型在32位机器上是占四个字节 所以指向下一个数组元素的地址就需要把地址移动四个字节这就是指针需要类型的原因。int a; char *p; a=4;/*输出的值是否相等取决于此处的赋值范围*/ p=&a; printf(%dn,a); printf(%dn,*p); 如果a在-128128间输出都是相等的超出范围后就不一样了。 这个就像我上面说的 如果是char型 那么printf函数从指针开始读取1个字节输出,如果是int型 那么printf函数从指针开始读取四个字节 a = 4 在内存中存储的为 0x04 0x00 0x00 0x00(intel的CPU应该是这样存储的 不同的cpu是不一样的好像 地址依次增加)所以当当a在-128128时 printf(%dn,a); printf(%dn,*p); 都输出0x04 (从指针开始读取一个字节和4个字节是一样的)如果a大于128 比如在内存中存储的为 0x04 0xFF 0x00 0x00 这样printf(%dn,*p); 就只读取了 0x04,0xFF被抛弃了,所以就不一样了。3.数组指针的初始化如果要将一块地址空间(也就是针变量里的值置零)进行初始化,一般这么写:char pstr20=NULL;/初始化时这么写,或者是:memset(pstr,NULL,sizeof(pstr);/代码中这么写,当然也可以是动态分配。char *pstr = new char20;/只要记住delete回收内存就可以了4.类指针的初始化动态分配一个类指针,比如:A *pA = new A那么这时一定要保证类中具有构造函数。如果A *pA=0 (好像是调用的默认构造函数吧,这个记得不太清楚了!)class A public: A()coutA cstendl; virtual A()coutA decstendl; void doSomething()couta is doing sometingendl; ; class B:public A public: B()coutB cstendl; B()coutB decstendl; /void doSomething()coutb is doing somethingdoSomething();

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论