| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2074 人关注过本帖
标题:【问题】C语言的指针到底在什么情况下用比较好?
只看楼主 加入收藏
houmin0036
Rank: 1
等 级:新手上路
帖 子:39
专家分:0
注 册:2013-1-15
结帖率:37.5%
收藏
已结贴  问题点数:18 回复次数:6 
【问题】C语言的指针到底在什么情况下用比较好?
《C程序设计》的指针章节学一半了  
搜索更多相关主题的帖子: C程序设计 C语言 
2013-03-23 11:54
Newnewblack
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2013-3-23
收藏
得分:0 
#include <stdio.h>#include <stdlib.h>#include <time.h>/*当然有必须使用二级指针才能解决的情况,如,某个函数的功能是返回某个问题的计算结果,但是结果数据是不确定个数的值,所以在调用此函数时不知道事先应分配多少空间来保存返回的数据,此时的处理办法就是传递一个没有分配空间的指针的指针(地址)进去,让函数自己根据计算的结果分配足够的空间来保存结果,并返回,调用者使用了结果后,由调用者负责内存的释放,即,大家可能听说过的"谁使用(调用)谁释放"之类的话,如下面的代码:*///返回不定结果个数的计算函数//参数int **pResult--为保存返回数据的指针的指针//参数int &count--为保存返回的结果个数void Compute2(int **pResult,int &count){ //使用随机数来模拟计算结果数的个数 srand(time(NULL)); count = rand()%10;//控制个数在10个以内 *pResult = new int[count]; for ( int i = 0 ; i < count ; i++ ) {  (*pResult)[i] = rand();//给结果随即赋值 }}//返回不定结果个数的计算函数(此函数不能返回数据)//参数int *pResult--为保存返回数据的指针//参数int &count--为保存返回的结果个数void Compute1(int *pResult,int &count){ //使用随机数来模拟计算结果数的个数 srand(time(NULL)); count = rand()%10;//控制个数在10个以内 pResult = new int[count]; for ( int i = 0 ; i < count ; i++ ) {  pResult[i] = rand();//给结果随即赋值 }}int main(void){ int *pResult = NULL;//待获取结果的指针 int count = 0;//返回结果的个数 ////pResult为指针,第二个参数使用引用传递,使用这个函数时,在函数内部分配的内存的指针并没有返回到主函数中 //Compute1(pResult,count); ////输出结果 //for ( int i = 0 ; i < count ; i++ ) //{ // printf("第 %d 个结果为 : %d\n",pResult[i]);//如果使用这种调用方法,可以看到,执行了Compute1()函数后,pResult的值还是为NULL //} //delete [] pResult; //pResult = NULL; //&pResult为指针的地址(即指针的指针),第二个参数使用引用传递 Compute2(&pResult,count); //输出结果 for ( int i = 0 ; i < count ; i++ ) {  printf("第 %d 个结果为 : %d\n",i,pResult[i]); } delete [] pResult; pResult = NULL; getchar(); return 0;}
2013-03-23 11:59
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用Newnewblack在2013-3-23 11:59:09的发言:

#include #include #include /*当然有必须使用二级指针才能解决的情况,如,某个函数的功能是返回某个问题的计算结果,但是结果数据是不确定个数的值,所以在调用此函数时不知道事先应分配多少空间来保存返回的数据,此时的处理办法就是传递一个没有分配空间的指针的指针(地址)进去,让函数自己根据计算的结果分配足够的空间来保存结果,并返回,调用者使用了结果后,由调用者负责内存的释放,即,大家可能听说过的"谁使用(调用)谁释放"之类的话,如下面的代码:*///返回不定结果个数的计算函数//参数int **pResult--为保存返回数据的指针的指针//参数int &count--为保存返回的结果个数void Compute2(int **pResult,int &count){ //使用随机数来模拟计算结果数的个数 srand(time(NULL)); count = rand()%10;//控制个数在10个以内 *pResult = new int[count]; for ( int i = 0 ; i < count ; i++ ) {  (*pResult) = rand();//给结果随即赋值 }}//返回不定结果个数的计算函数(此函数不能返回数据)//参数int *pResult--为保存返回数据的指针//参数int &count--为保存返回的结果个数void Compute1(int *pResult,int &count){ //使用随机数来模拟计算结果数的个数 srand(time(NULL)); count = rand()%10;//控制个数在10个以内 pResult = new int[count]; for ( int i = 0 ; i < count ; i++ ) {  pResult = rand();//给结果随即赋值 }}int main(void){ int *pResult = NULL;//待获取结果的指针 int count = 0;//返回结果的个数 ////pResult为指针,第二个参数使用引用传递,使用这个函数时,在函数内部分配的内存的指针并没有返回到主函数中 //Compute1(pResult,count); ////输出结果 //for ( int i = 0 ; i < count ; i++ ) //{ // printf("第 %d 个结果为 : %d\n",pResult);//如果使用这种调用方法,可以看到,执行了Compute1()函数后,pResult的值还是为NULL //} //delete [] pResult; //pResult = NULL; //&pResult为指针的地址(即指针的指针),第二个参数使用引用传递 Compute2(&pResult,count); //输出结果 for ( int i = 0 ; i < count ; i++ ) {  printf("第 %d 个结果为 : %d\n",i,pResult); } delete [] pResult; pResult = NULL; getchar(); return 0;}

神排版 估计可以参加看不懂的代码大赛了。。。
2013-03-23 12:22
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:18 
我说几个感觉应该用指针的情况 抛砖引玉

1 内存管理
2 某些时候用于传递参数 比如传递指向结构体的指针
3 用于寻址 比如用指针操作数组 但这里的主要目的是增加灵活性 一般不会有效率上的提高
4 函数指针

暂时这么多 欢迎补充
2013-03-23 12:26
小xiong
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:388
专家分:1722
注 册:2013-2-8
收藏
得分:0 
....
2013-03-23 12:41
houmin0036
Rank: 1
等 级:新手上路
帖 子:39
专家分:0
注 册:2013-1-15
收藏
得分:0 
回复 4楼 zklhp
推荐本书好吗
2013-03-23 17:24
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:0 
在不得不用的时候用

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-03-23 18:46
快速回复:【问题】C语言的指针到底在什么情况下用比较好?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036832 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved