我是c语言初学者!我想请教下!在c语言中为什么要引入指针这个概念!它的微妙之处在哪里?有大神帮我分 为什么要学习指针,我不明白c语言中,指针的作用,与便利之处,...

作者&投稿:米佳 (若有异议请与网页底部的电邮联系)
C语言引入指针,是为了直接操作计算机内存。这个功能使得可以用C语言写操作系统、驱动程序之类系统底层的程序。
指针的微妙之处:
1、每个指针本身有一个对应的内存单元,这个内存单元中可以存放别的变量、函数等等的内存地址。
2、指针是有类型的。如char*,int*,float*,double*,void*等等。
3、指针类型,决定了指针+1,-1等操作实际移动的距离。移动的距离是对应类型的sizeof()值。
换句话说,指针+1,-1不是移动一个内存单元。
4、指针要指向某个实际对象,或者通过malloc()函数给它分配一个内存后,才有了确定的意义,才能进行操作。否则会出错!
5、指针操作,越界了,编译程序不知道,常常引起系统错误,甚至破坏系统!!
6、指针也可以指向指针,或者指针的指针。比如int **p。这个有时会让人很困惑。

在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元等,在前面已有详细的介绍。为了正确地访问这些内存单元,必须为每个内存单元编上号。根据一个内存单元的编号即可准确地找到该内存单元。内存单元的编号也叫做地址。既然根据内存单元的编号或地址就可以找到所需的内存单元,所以通常也把这个地址称为指针。

内存单元的指针和内存单元的内容是两个不同的概念。 可以用一个通俗的例子来说明它们之间的关系。我们到银行去存取款时,银行工作人员将根据我们的帐号去找我们的存款单, 找到之后在存单上写入存款、取款的金额。在这里,帐号就是存单的指针, 存款数是存单的内容。对于一个内存单元来说,单元的地址即为指针,其中存放的数据才是该单元的内容

因为C语言开发时是基于B语言的,当时它的开发要考虑到机器语言和一般编程语言的特点,所以他便具有了机器语言的一些特点,最基本的是要能够对内存进行直接操作,如何实现这一功能?天才的设计者就想出来用指针来实现这一功能。

C语言中既然有取址运算符&,为什么还要引入指针*?~

编程中指针在使用以后,灵活多用,可以取别名来取地址
而地址操作符很繁琐,每次必须使用引用的变量
就如同指路:指针相当于你用地图来指
取地址符相当于你不能用路名,不能用门牌号码,不能用参照物。

指针优点:
(1)可实现跨函数操作变量。在C 语言中,基本执行单位是函数,用户可以自定义多个函数,被调用函数通过return将处理结果返回给调用函数,但是return函数只能带回一个值;如果带回的结果多于一个,则可以通过指针变量跨函数操作变量,从而实现“带回多个值”。或者,在一个函数中要改变另一个函数中的变量,也可以通过指针来实现。
(2)节省内存空间,执行效率高。在处理结构体相关操作时,如果将结构体作为函数参数,则每次传递参数时,系统为形参开辟的空间比较大;若使用指向结构体的指针变量,则只需开辟4个字节的空间,即可完成参数传递和进行相应的处理。
(3)操作方便。特别是对于链表、二叉树、图等的相关操作,使用指针可以方便的实现结点遍历、插入、删除等操作。
缺点:
(1)容易造成内存泄漏。之前定义和使用的指针变量没有释放,造成可使用的内存越来越少。
(2)使用不当时,容易造成非法访问。
为了避免指针给程序带来负面影响,在Java将指针封装起来了(其实Java中是有指针的)。
个人拙见,欢迎补充。

我初学C语言,请教一下高手
答:因为你判数素数中的循环条件是i<=k+1;如果这一层循环体中的break不能被执行时,循环结束时i和的值至少是等于k+1,而sqrt的返回值是double型的,所以还要大于k+1,才能保证i的覆盖范围啊

我是一个c语言初学者,有问题请教前辈。
答:第一道题:include "stdio.h"main(){float eps,s=0,i=4,k=1;int f=1;printf("\ninput eps:");scanf("%f",&eps);while(f*k>eps){s+=k;f*=-1;k=f*(1.0/i);i+=3;} printf("s=%f",s);getch();} 第二道题:include"stdio.h"main(){int f1=1,f2=1,f3,n,i=3;...

一个初学者想请教下c语言
答:dos下的使用权限,也是有限的,点击右下角的 “更多操作” ,选择允许本次操作

怎么自学c语言,需要怎么学习?
答:3.多动手操作。很多同学用电脑打字不够熟练,会导致在编程过程中速度慢,且正确度不高,最容易出现输入法中英文问题,如果时间充足的,可以专门练一下电脑打字速度。如果课程紧张时间不够的话,多动手即可。这是对于C语言初学者的建议,如果 c语言已经学习了一段时间的,建议大家打开Dev c++的联想功能,...

大学时学习c语言,新手有哪些技巧可以快速入门?
答:大学学习c语言的时候,新手写编程有些难,这个时候,我建议你,先去买一些书籍,研究一下,然后,可以去网络上找一些课程,学习一下。我记得我当时就是这样,然后大概学了三天之后就入门了,接下来,我就是在我电脑上每天写编程,写了一段时间之后,就感觉无所不会,无所不能了。

求C语言高人。小弟大一初学,有几个简单的请教。
答:3) 答案:90 此题考查逗号运算,逗号运算的结果为最后一个表达式的值,此题中为b,因b的值为90,所以整个逗号表达式(a,b)的最终结果为90;4) 答案:12 wa=sum++,wa++,++wa;也是逗号表达式,按从左到右的顺序依次执行,wa=sum++,自加在后,wa值为10,但执行完该句后sum值变为11。wa...

C语言过来人求教
答:用心,勤动手,多思考。我想只要做到了这几点就可以了。.老实说,学习是没有捷径的,刻苦才是硬道理。在刻苦的基础上加上方法就是事半功倍的效果。多写代码是关键,书上的例程要看懂、理解后,自己在不看书的情况下写出一个类似程序(不要背了默写)谈及C语言,我想凡是学过它的朋友都有这样一种...

初学C语言,请教各位
答:当然这个不会引起错误。5.有的时候main的后面跟上一个void,但有的时候没有...为什么呢?不知道你的具体意思,如果是说main void的形式,那肯定是不对的,如果是void main()形式的定义,那是可以的,至少在vc下是ok的。因为c语言并没有规定main的返回类型。不过标准C++规定main必须是int返回类型。

C语言初学者请问这道题怎么做?
答:遍历字符串S,使用数组统计其中26个字母分别出现的次数 最终最少的字母出现次数即为可以召唤的神龙数 再乘以n就是可以实现的愿望数 C语言参考代码如下:include <stdio.h> int main(){ long long int n; // 注意n的取值范围超过了2^31-1,应取长整型 scanf("%lld", &n);char S[1000000];s...

C语言小白请教大神:
答:你的printf("%s\n",work[i])中的\n 不是换行符吗?你加上不就是输出一个加个回车吗?当然输出的是纵向的啊!