| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 992 人关注过本帖
标题:各位各位,来探讨下指针在函数里面的用法。
只看楼主 加入收藏
空白先生
Rank: 2
等 级:论坛游民
帖 子:115
专家分:95
注 册:2012-12-9
结帖率:92.86%
收藏
已结贴  问题点数:20 回复次数:23 
各位各位,来探讨下指针在函数里面的用法。
其实最近才接触指针,发现指针在自定义的函数里面用的比较频繁,所以就有实参是指针,形参也是指针;实参是数组,形参是指针;实参是数组,形参也是数组;这几种情况。
小弟现在脑子有点晕呀,是不是第一种是最好的?
还有一个问题是:指针是可以不用的吧,虽然教材上说指针是C语言的精华,可是到现在为止,我还是没发现它有什么特别的好处,各位大侠能举一些例子吗?
搜索更多相关主题的帖子: C语言 最好 
2012-12-26 15:57
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:3 
实参是指针的情况经常用,书上说当实参是指针时,行参是指针还是数组都一样,因为数组会退化成指针,地址的传递可以改变原数组
程序代码:
#include<stdio.h>
void cvbn(int a[4]){
    int b;
    for(b=5;b<9;b++)
        a[b-5]=b;
}
main(){
    int a[4]={1,2,3,4};
    int i;
    cvbn(a);
    for(i=0;i<4;i++)
        printf("%d   ",a[i]);
}
程序代码:
#include<stdio.h>
void cvbn(int *a){
    int b;
    for(b=5;b<9;b++)
        a[b-5]=b;
}
main(){
    int a[4]={1,2,3,4};
    int i;
    cvbn(a);
    for(i=0;i<4;i++)
        printf("%d   ",a[i]);
}
的结果是一样。
只有数组做实参的情况我还从来没用过,不好发表见解

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-12-26 16:23
空白先生
Rank: 2
等 级:论坛游民
帖 子:115
专家分:95
注 册:2012-12-9
收藏
得分:0 
回复 2楼 yaobao
还是猫哥最帅了。指针指向二维数组的时候*((*p+i)+j)这样子为什么老是出现illegal indirection,网上搜了一下说是这是C语言里面的一个错误直译就是 非法的取值了   如果把一个实变量当作一个指针赋值,那我在输出的时候用printf("%d ",*((*p+i)+j)),为什么会这样呢

printf("My goal is to be  good at computer")
2012-12-26 16:47
wkz2012
Rank: 4
等 级:业余侠客
帖 子:123
专家分:253
注 册:2012-12-13
收藏
得分:3 
以下是引用空白先生在2012-12-26 16:47:17的发言:

还是猫哥最帅了。指针指向二维数组的时候*((*p+i)+j)这样子为什么老是出现illegal indirection,网上搜了一下说是这是C语言里面的一个错误直译就是 非法的取值了   如果把一个实变量当作一个指针赋值,那我在输出的时候用printf("%d ",*((*p+i)+j)),为什么会这样呢
你这里的p是指向二维数组的第一行吗,也就是是不是等价于二维数组名?如果不是,那就是错的。还有,如果p是指针的话,那里面应该不是*p+i吧,而是p+i。
个人觉得*((p+i)+j)应该指向二维数组中的元素a[i][j]。(当然有个条件,p等价于a,即指向a[0])

我了个去的编程!
2012-12-26 16:57
空白先生
Rank: 2
等 级:论坛游民
帖 子:115
专家分:95
注 册:2012-12-9
收藏
得分:0 
回复 4楼 wkz2012
兄台言之有理

printf("My goal is to be  good at computer")
2012-12-26 17:17
空白先生
Rank: 2
等 级:论坛游民
帖 子:115
专家分:95
注 册:2012-12-9
收藏
得分:0 
还有问题啦,指针的优点是什么,我们C语言老师说C语言相对于Jave的优点是存在指针,不解

printf("My goal is to be  good at computer")
2012-12-26 17:19
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:3 
你老师不说Java取消指针是基于什么理由?知道那个理由,就知道C用它有什么优点。

授人以渔,不授人以鱼。
2012-12-26 17:22
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
里面的星你拿到括号外试试

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-12-26 17:39
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:3 
学习的目的不同 对指针的态度也不同

1 学C语言是为了学习其他的语言 比如Java 比如脚本语言 那可以不深究指针 因为你学C本身就不必要学深
2 业余爱好者 这样你用什么都可以 不必要在一棵树吊死
3 学生 指针是考点 但考的并不深 教材上的都会了就可以了罢
4 实际的C语言开发者 或者说要用C语言 要学到一定的水平 不管怎么分析 只要有C语言 就会用到指针 这个几乎是必然的

指针其实很简单 麻烦的就是和其他东西混一块 这就要求对于概念或者说各种东西的理解要深

优点么 目前的主要优点是

1 实现某些非指针不可的功能 比如内存管理
2 增加编程或者说程序的灵活性

最大的缺点或者是问题是 并不能显著提高程序的效率但会增加程序出问题的概率 因为在指针上出的问题太多了

我是业余爱好者 说错勿怪
2012-12-26 17:50
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
我来帮你搜索:

Java和C/C++的差异

  熟悉C语言和C++语言的读者一定想搞清楚这个问题,实际上,Java确实是从C语言和C++语言继承了许多成份,甚至可以将Java看成是类C语言发展和衍生的产物。比如Java语言的变量声明,操作符形式,参数传递,流程控制等方面和C语言,C++语言完全相同.尽管如此,Java和C语言,C++语言又有许多差别,主要表现在如下几个方面:

   (1) Java中对内存的分配是动态的。它采用运算符new为每个对象分配内存空间。而且,实际内存还会随程序运行情况而改变。程序运行中 Java系统自动对内存进行扫描,对长期不用的空间作为”垃圾”进行收集,使得系统资源得到更充分地利用。按照这种机制,程序员不必关注内存管理问题,这使Java程序的编写变得简单明了,并且避免了由于内存管理方面的差错而导致系统出问题。而C语言通过malloc()和free()这两个库函数来分别实现分配内存和释放内存空间的,C++语言中则通过运算符operator new和operator delete来分配和释放内存。在C和C++中,程序员必须非常仔细地处理内存的使用问题。一方面,如果对己释放的内存再作释放或者对未曾分配的内存作释放,都会造成不可预料的后果;而另一方面,如果对长期不用的或不再使用的内存不释放,则会浪费系统资源,甚至因此造成资源枯竭。

   (2) Java不在所有类之外定义全局变量,而是在某个类中定义一种公用静态的变量来完成全局变量的功能。

   (3) Java不用goto语句,而是用try-catch-finally异常处理语句来代替goto语句处理出错的功能。Java中有goto保留字,但它没有任何效果,换句话说,我们不能使用goto来进行跳转到某行。实际上,结构化程序设计完全不需要goto语句即可完成各种流程,而goto语句的使用往往会使程序的可读性降低,所以Java不允许goto跳转,Java中的标签是为循环设计的是为了在多重循环中方便的使用break和coutinue而设计的。

   (4) Java不支持头文件,而C和C++语言中都用头文件来声明类、变量、函数等,这种采用头文件的结构使得系统的运行维护相当繁杂。

   (5) Java不支持宏定义,而是使用关键字final来定义常量,在C/C++中可以用宏定义来实现常量定义,这可能有害于程序的可维护性。

   (6) Java对每种数据类型都分配固定长度。比如,在Java中,int类型总是32位的,而在C和C++中,对于不同的平台,同一个数据类型分配不同的字节数,同样是int类型,在PC机中为二字节即16位,而在VAX-11中,则为32位.这使得C语言造成不可移植性,而Java则具有跨平台性(平台无关性)。

   (7) 类型转换不同。在C和C++中,可通过指针进行几乎任意的类型转换,常常带来不安全性。而在Java中,运行时系统对对象的处理要进行类型相容性检查,及早发现转换错误。

   (8) 没有结构和联合。在C和C++中,结构和联合的所有成员均为公有,可能造成安全性问题。而Java中根本就不包含结构和联合,所有的内容都封装在类里面。

  (9) Java不再使用指针。指针是C和C++中最灵活,也最容易产生错误的数据类型。由指针所进行的内存地址操作常会造成不可预知的错误,同时通过指针对某个内存地址进行显式类型转换后,可以访问一个C++中的私有成员,从而破坏安全性。而Java对指针进行完全地控制,程序员不能直接进行任何指针操作。

  (10)避免运行时平台依赖。Java语言实现的库可以在其它平台的Java应用程序中使用,而不像通常的C、C++等实现一样,目标代码依赖于特定的硬件体系结构乃至操作系统等环境。

授人以渔,不授人以鱼。
2012-12-26 17:55
快速回复:各位各位,来探讨下指针在函数里面的用法。
数据加载中...
 
   



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

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