材型专业学c语言,c语言学习知识中的指针专业题材.doc

c8da8f5a7cda2d62dda9e5a200b168b9.gifc语言学习知识中的指针专业题材.doc

-c语言中的指针专题http//2006-05-24 100236来源 aspcool网友评论8条 论坛作者anangcl一、数组的指针、指针数组以及指向指针的指针考虑数组的指针的时候我们要同时考虑类型和维数这两个属性。换一句话,就是说一个数组排除在其中存储的数值,那么可以用类型和维数来位置表示他的种类。A)一维数组在c和c中数组的指针就是数组的起始地址(也就第一个元素的地址),而且标准文档规定数组名代表数组的地址(这是地址数值层面的数组表示)。例如int a10; int *p; p由于数组名代表数组的起始地址,所以a(第一层)和第一个元素a00地址的数字是相同的,但是意义却是不同的。对于该数组我们可以理解为a的一维数组(第一层),它有四个元素a0、a1、a2、a3(第二层),而每个元素又含有6个元素a00,a01,a02,a03,a04,a05(第三层),到此我们终于访问到了每个元素了,这个过程我们经历了a-a0-a00;整体来讲a是一个4行5列的二维数组,a表示它指向的数组的首地址(第一个元素地址//而不能是int *p10 或者char *p10; 此时p是一个指针(数值上和//使用pt指向t 那么这里我们用什么指向int *t10中的t呢我们要使用一个指针的指针int **ptt; 这是因为在int *t10中,每个元素是指针,那么同时t又指向这个数组,数组上和 D指针的指针一个指针变量内部可以存储一个值,这个值是另外一个对象的地址,所以我们说一个指针变量可以指向一个普通变量,同样这个指针变量也有一个地址,也就是说有一个东西可以指向这个指针变量,然后再通过这个指针变量指向这个对象。那么如何来指向这个指针变量呢由于指针变量本身已经是一个指针了(右值),那么我们这里就不能用一般的指针了,需要在指针上体现出来这些特点,我们需要定义指针的指针(二重指针)。int *p1 int**p2 void fun1int *p; void fun2int *p3; void fun3int **p; void fun4int p3; void fun5int p; void fun6int p23; void fun7int 函数 不会产生编译时刻的可能值(但逻辑上不一定都对)函数不会产生编译时刻的可能值(但逻辑上不一定都对)fun1a, 不能是int *pint I,int j, 这样就变成了返回指针的函数声明了。在C中处于对安全性的考虑,指针和它指向的对象要类型一致,也就说上面的指针所指向的函数的特性要和它一模一样例如指向int minint I,int j;是可以的。但是指向int mindouble I ,double j;是不可以。函数指针也和其他的指针一样,在使用的时候很怕发生悬空,所以在使用的时候同样要判断有效性,或者在定义的时候就初始化。int *pint I,int jmin; int *pint I,int j int *pint I,int j0; B 函数的指针参数函数指针可以作函数的参数例如我们有一个积分的算法,对于不同的数学函数可以进行积分(我们这里假设函数都是一元的);那么我们的算法接口可以定义为templateT integrate T lower, T upper , T *T0 throwintegrated_exp; 这里的最后的参数是一个函数的指针,并且被设定缺省值为0。这个函数返回一个值,同时需要一个参数。假如加入我们有这样的一个函数double linedouble x return a*xb; 那么我就可以使用了。函数指针还可以作为返回类型(注意不是函数,某个特定的函数是不可以作为返回类型的。)假设typedef int *PFint ; PF getProcess ;//true C 返回指针的函数一个函数的返回是函数的重要接口之一,c的一个重要的强大的功能就是能够设计足够复杂和好用的用户自定义类型。而同时处理和传递这些类型也是很麻烦的一件事情,我们不想把我们的时间都花在这些对于我们的实际工作没有很实质帮助的拷贝上,解决这个问题就要依赖我们的接口设计c和c都提供了相应的解决方案,在c中我们可是使用引用,讲他们作为函数的实际参数,或者我们在函数的实际参数中使用一个指针等。同样我们还可以使用一个函数返回一个指针但是这是一个很不好解决的问题我们首先容易出错的是将一个局部变量的地址传出来例如UserType * Process UserType utparam-list; //process ut; return // 这个变量在我们的函数结束的时候就被销毁了,尽管地址可以传出去,但是这个地址已经不存在了,已经不能使用的东西,在这个函数之外却不知道,难免要出错同时我还会有一个比较麻烦的问题使用new,又容易造成内存泄露UserType * Process UserTpye *putnew UserTypeparam-list ; //process put; return put; 我们在函数内部使用了一个new,分配了一个空间,这样传出来也是可以就是说不会发生上面的问题了。但是用户通常都会忘记在程序的外面在把这个借来的空间还回去内存空间就这样泄露了可能也是这些另人无奈的问题,所以很多程序员把函数的参数设定为指针或者引用,以此来代替这种向外传输吧总之,使用这种返回指针的函数要小心三、类成员的指针类成员和一般的外部变量相互比较,不同就是它所在的域不同,这个域很重要,它决定了该变量可以使用的范围。那么一个指针如果要指向类的成员函数或者成员变量,那么除了要表达它的返回类型、参数列表或者类型之外,那么还要说明它所指向的变量(或者函数)的域,为了说明该域我们要使用类域限定class NJUPT static double money20000000; int num; public NJUPTnum10; int getreturn num;; double getMoneyreuturn money; 我们定义成员的指针为int NJUPT *p;//指向int型成员变量 int NJUPt*p//指向int f型成员函数。 为了使用这些指针,我们需要使用该类型的变量或者指针。NJUPT s,*ps; 那么调用的方式为cout*p; 这个看起来似乎很奇怪但是只要你想到我们定义的指针被限定在了类域中了(我们在开始定义的使用使用了NJUPT ),这么使用也是很自然的。如果一个类还有一些静态成员变量和静态成员函数,那么我是否也想这样使用呢答案是不用,静态成员我们就可以象使用外部的普通成员一样定义一个指针或者函数指针来访问就可以了,究其原因主要是这个成员的类型性质决定的。double *p double *pNJUPTgetMoney

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值