文档详情

C语言_ch08_6_指针数组和多重指针动态内存分配.ppt

发布:2017-05-09约字共43页下载文档
文本预览下载声明
本节内容 指针数组pointer array 多重指针int ** 带参的main 动态内存分配 void*的引用和赋值 野指针(悬挂指针) 与指针相关的编程规则 习题 下面的标识符是什么类型? float (**def)[10]; def是个二级指针,它指向一个一维数组的指针,数组元素是float型。 double *(*gh)[10]; gh是一个指向一维数组的指针,数组元素是double*型。 double (*f[10])(); f是一个函数指针数组,数组元素都是指向函数的指针,函数类型是没有参数且返回 double的函数。 int * ((*b)[10]; 和int*(*b)[10]一样,b是一维数组的指针,数组元素类型为int*。 long (*fun)(int) fun是一个函数指针,指向一个有一个int形参并返回long的函数 习题 static int a[3][3]={1,3,5,7,9,11,13,15,17},y,x,*p=a[2][2]; for (x=0;x3;++x) y+=*(p-4*x); printf(“\n%d”, y); 习题 请用变量a给出下面的定义,你能做到吗? a)一个有10个指针的数组,该指针是指向一个整型数的(Anarrayof10pointerstointegers) b)一个指向整型数的指针(Apointertoaninteger) c)一个指向指针的的指针,它指向的指针是指向一个整型数(Apointertoapointertoaninteger) d)一个有10个整型数的数组(Anarrayof10integers) e)一个整型数(Aninteger) f)一个指向有10个整型数数组的指针(Apointertoanarrayof10integers) g)一个指向函数的指针,该函数有一个整型参数并返回一个整型数(Apointertoafunctionthattakesanintegerasanargumentandreturnsaninteger) h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数(Anarrayoftenpointerstofunctionsthattakeaninteger argumentandreturnaninteger) 答案是: a)int*a[10];//Anarrayof10pointerstointegers b)int*a;//Apointertoaninteger c)int**a;//Apointertoapointertoaninteger d)int a[10];//Anarrayof10integers e)int a;//Aninteger f)int(*a)[10];//Apointertoanarrayof10integers g)int(*a)(int); h)int(*a[10])(int); * * void的使用 规则一:如果函数没有返回值,那么应声明为void类型 规则二:如果函数无参数,那么应声明其参数为void 规则三:小心使用void指针类型 规则四:如果函数的参数可以是任意类型指针,那么应声明其参数为void * * * 关于野指针(悬挂指针) 悬挂指针:既不为空,也没有被设置为与另一个对象有链接关系的指针。 野指针是非常危险的,所以要杜绝野指针。参见《高质量C++/C编程指南》 -- 第7章 内存管理 (2) * * 野指针的成因主要有两种: (1)指针变量没有被初始化。 未被初始化的指针变的缺省值是随机的。所以,指针变量在定义的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。例如 char *p = NULL; char *str = (char *) malloc(100); (2)指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。 * * (3)指针操作超越了变量的作用范围。这种情况让人防不胜防,示例程序如下: class A { public: void Func(void){ cout Func of class A endl; } }; void Test(void) { A *p; { A a; p = a; // 注意 a 的生命期 } p-Func(); // p是野指针 } 函数Test在执行语句p-Func()时,对象a已经消失,而p是指向a的,所以p就成了野指针。但奇怪的是我运行这个程序时居然没有出错,这可能与编译器有关。 * * 与指针相关的编程规则 减少出错的根本是彻
显示全部
相似文档