转:简单类型指针的与复杂类型指针定义以及分配的问题
指针是体现C语言强大功能的灵魂,很多人对指针的用法总是很模糊,特别是什么时候该对指针分配空间,什么时候只需要定义下就行了。本文以一个小例子说明与指针有关的声明,定义,以及分配的问题。
1.简单指针类型
我们以char* 为例,在程序中我定义一个char*型指针pString;
char* pString = NULL; pString = "yes, pString"; printf(pString);程序输出结果:yes, pString
然后我们定义另外一个char*型指针并给它分配空间,并初始化;
char* qString = new char[6]; qString = "yes, qString" //这里,读者可能会想到越界了! printf(qString);
程序输出结果:yes, qString
究竟出现了什么呢,我们对qString只分配了6字节的空间,为什么程序编译时不报错,且运行结果就是我们初始化qString的字符串。原因是qString在第二条语句执行后其值发生了变化,系统对qString进行了重新空间分配,导致qString的值发生了变化,即qString不再指向6字节空间,而是成为了初始化字符串的首地址。
以上,我们可以看出,对char*型指针,其空间的分配可以看作是系统自动完成的,读者不必关心。
2.稍复杂指针类型
我们以一个结构体指针为例来说明,在程序中我们定义一个结构体,并定义一个指向该结构体的指针;
总结,其实我们有很多学C++的同学们经常遇到这样的问题,我们定义一个类,然后定义一个指向该类对象的指针。
究竟出现了什么呢,我们对qString只分配了6字节的空间,为什么程序编译时不报错,且运行结果就是我们初始化qString的字符串。原因是qString在第二条语句执行后其值发生了变化,系统对qString进行了重新空间分配,导致qString的值发生了变化,即qString不再指向6字节空间,而是成为了初始化字符串的首地址。
以上,我们可以看出,对char*型指针,其空间的分配可以看作是系统自动完成的,读者不必关心。
2.稍复杂指针类型
我们以一个结构体指针为例来说明,在程序中我们定义一个结构体,并定义一个指向该结构体的指针;
typedef struct LNode { int data; struct LNode* pNext; }dataNode, *dataList; dataList pData; pData->data = 10; pData->pNext = NULL;
程序只是一个简单的初始化工作,有没有问题呢。编译通过,但运行时就会产生异常。原因就是我们并没有对pData分配空间,在未对该指针分配空间前,该指针并没有实质性的内容所指向,这时,你不能对其任何成员赋值,否则就会产生异常。把dataList pData;这一句用dataList pData = new pData;替换就可以了。
总结,其实我们有很多学C++的同学们经常遇到这样的问题,我们定义一个类,然后定义一个指向该类对象的指针。
class myClass { . . } myClass* pMyClass; //1 myClass* qMyClass = new myClass; //2
如果你的程序编译通过,但运行时指针产生异常越界等问题,你是否该考虑一下用1句还是2句。
//下面仅仅是定义一个类型,不会产生变量,所以不存在分配空间的问题 struct data { int i; int j; }; void main(void) { struct data dat1; //定义一个struct data类型的变量,和int i同理。 printf("%d\n", sizeof(struct data)); //8个字节 printf("%d\n", sizeof(dat1)); //8个字节 struct data* pdat1;//定义一个struct data类型的指针,和int *pi 同理。 printf("%d\n", sizeof(pdat1)); //4个字节,就是一个指针的空间,pdat1并没有结构体变量的信息。 pdat1 = (struct data*)malloc(sizeof(struct data)); //申请一个空间,把该空间地址给pdat1. printf("%d\n", sizeof(*pdat1)); //8个字节 struct data dats1[2]; printf("%d\n", sizeof(dats1)); //16个字节,两个data变量,不是data指针。 dats1[0].i = 20; //可以直接使用数组里面的结构体变量 dats1[0].j = 30; struct data* dats2[2]; //指针数组,包含两个指针,而不是结构体变量 printf("%d\n", sizeof(dats2)); //8个字节,两个指针的大小 dats2[0]->i = 20; //错误!还没有给dats2[0] 指针分配空间 dats2[0]->i = 20; //错误!还没有给dats2[0] 指针分配空间 dats2[0] = (struct data*)malloc(sizeof(struct data)); //分配空间 dats2[0]->i = 20; //ok dats2[0]->i = 20; //ok }
本文转自:http://www.cppblog.com/hustsaser/articles/56432.html和http://blog.csdn.net/yinidream/article/details/6761662