c语言为什么要用指针(C语言开发指针用的多吗)

admin 370 0

大家好,关于c语言为什么要用指针很多朋友都还不太明白,今天小编就来为大家分享关于C语言开发指针用的多吗的知识,希望对各位有所帮助!

一、请问在C中使用指针的好处有哪些

1、在数据传递时,如果数据块较大(比如说数据缓冲区或比较大的结构),可以使用指针传递地址,既提高传输速度,又节省大量内存。

2、数据转换,利用指针的灵活的类型转换,可以用来做数据类型转换,比较常用于通讯缓冲区的填充。

3、字符串指针,是使用最方便,且常用的。

4、函数指针,可以用在大量分支处理的实例当中,如某通讯根据不同的命令号执行不同类型的命令,则可以建立一个函数指针数组,进行散转。

5、在数据结构中,链表、树、图等大量的应用都离不开指针。

二、C语言中的指针到底有什么用

1、所有变量值保存在内存中,而每个内存都有一个地址,所谓地址就是一个整数编号,如同门牌号码用于定位(专业术语叫寻址),一个地址对应一个字节(8bit)的内存单元。

2、如今的编译器,一个整数int类型的值占用32位bit,也就是4字节,编译器将第一个字节的编号定义为该整数的地址,由于保存地址的变量就像一个箭头指向某地址,而称为指针变量。

3、int a=10;//定义一个整数变量a,对其赋值10

4、int*p=&a;//定义一个指针变量p,对其赋值a的内存地址,&符号意思为引用跟随其后的变量地址。

5、cout<<a<<endl;//输出 a的值:10

6、cout<< p<< endl;//输出p的值:XXXXX其实为a的地址,该地址由编译器和运行时确定。

7、cout<<*p<<endl;//输出p指向的地址中的值:10,也就是a的值,*星号放在变量前面意思就是取该变量中的地址所指内存中的值。

8、读取过程为:p的值(a的地址)->寻址->取值

9、由于指针是一个变量的首个字节的地址,所以要告诉编译器被指地址包含连续多少个字节,因此指针也有类型。比如上面例子中声明了p指针是个整数指针,这样编译器知道p指向一个4字节的内存块。

10、你可以将指针变量看做一般的整数变量来理解,用来保存一个整数(地址是个整数),只是,该整数代表着某地址,在这里是a的地址。

11、在C/C++中很灵活,但是也很危险,也很难学,如果指针指向错误的地址会引起程序崩溃,因此在C#中已经被微软封装了,但内部还是有指针的。

12、如果有必要,C#中也可以使用指针,使用非安全代码,在项目生成选项卡中勾选“允许非安全代码”,然后就可以使用指针了,不过不建议这么做。

三、C语言——什么时候用指针

1.什么时候都可以用指针,因为用指针的效率比用变量高。

2.当一个函数要返回1个以上的运算结果时,就必须用指针,因为一个函数只能返回一个值,更多的得用指针“带回”。

3.操作数组时,用指针不仅方便得多而且代码时效很高。

4.操作文件时,不用指针寸步难行。

5.利用指针可以简化函数调用的书写过程,使源代码易于阅读。

四、C语言 为什么用指针变量效率较高

指针变量是有加减运算的,但是要注意以下几点:

1.指针变量中存放的是地址值,也就是一个数字地址,例如某指针变量中的值是0x20000000,表示表示此指针变量存放的是内存中位于0x20000000地方的内存地址。指针变量可以加减,但是只能与整型数据加减,此时加减的含义并不是其地址值进行了加减,也就是说如果指针变量p的值是0x20000000,那么p=p+2;的值并不是0x20000002,并不是地址值的简单相加,那么地址值加减多少是与指针指向的数据类型相关联的,如果在32位的操作系统上,p是指向整型数据的指针变量,那么p=p+2之后,p的地址值变成0x20000008,也就说实际上地址值加了多少呢:sizeof(int)*2这么多。说明白点,我们加减的数字是以指针指向的数据类型为量度的,P+2表示p在内存中前移两个int的距离,如果p不是int类型,而是其他类型道理也是一样。同样指针与整型数据相减也是同样的道理。

2.指针之间可以相减,但不可以相加:两个同一类型的指针变量是可以相减的,他们的意义表示两个指针指向的内存位置之间相隔多少个元素(注意是元素,并不是字节数),例如对于int类型的指针p和p1. p1-p的意义表示他们之间相隔多少个int类型的元素。同样对于其他类型的指针变量之间相减的意义也是一样。指针变量的自加和自减实际上是与整数1的加减运算。

3.指针之间可以比较大小。但是同样也限于两个相同类型的指针变量,不同类型的指针变量之间比较大小没有任何意义。指针之间的大小比较的意义,表示在内存中他们指向的位置的高低关系。

五、C语言中交换两个数为什么一定要用指针和调用函数

1、我刚入门的时候也是这样想的,哈哈。

2、但是随着你学的深入,你会知道指针才是c语言的灵魂。

3、用函数交换变量,如果不用指针的话,是无法进行的,因为函数只能改变形参,而对于主函数的实参,是没有交换作用的(这里得好好想想,初学可能会糊涂的点就在这)

4、指针的作用很多的,下面是我上课做的一些笔记,你可以看看。

5、快速的传递数据,减少内存的耗用

6、是理解面向对象语言中引用的基础

六、C语言 写一个函数交换两个数的值,为什么一定要用指针

1、运用代码解释指针运用的理解如下:

2、cout<<"a1:"<<a<<";b1:"<<b<<endl;

3、cout<<"a2:"<<*a<<";b2:"<<*b<<endl;

4、cout<<"a3:"<<*a<<";b3:"<<*b<<endl;

5、cout<<"a4:"<<*a<<";b4:"<<*b<<endl;

6、cout<<"a5:"<<a<<";b5:"<<b<<endl;

7、cout<<"aa1:"<<aa<<";bb1:"<<bb<<endl;

8、cout<<"aa2:"<<aa<<";bb2:"<<bb<<endl;

9、cout<<"aa3:"<<aa<<";bb3:"<<bb<<endl;

10、cout<<"aa4:"<<aa<<";bb4:"<<bb<<endl;

11、cout<<"aa5:"<<aa<<";bb5:"<<bb<<endl;

12、main中调用fun1()时,将实参a,b的值传递给了交换函数,如果此时在swap1中打印,可以看到结果是正确的,但是该过程其实是将aa和bb分别复制了一份给了函数,执行完fun1()之后,aa和bb的值没有任何变化。

13、fun2(),看似的确使用了指针,但还是失败,因为这里是将aa和bb的地址给交换了,而并没有交换aa和bb的值。在这里由于未给c赋值,c中并没有确定的值,c中的值是不可预见的。此时c可能指向一个未知的存储单元。

14、而严重的情况是,该单元的数据可能是有用的,因此fun2()不但没有实现两个数的交换,反而给系统的稳定性带来威胁。

15、fun3(),将int赋值给int*,编译错误。

16、fun4()是正确的。为了在函数中改变了的变量能被其它函数调用,正确的办法是用指针变量作为函数参数,在函数执行过程中使指针变量所指向的变量值发生变化。

17、函数调用结束后,哲别变量值的变化依然保留下来,这样就实现了通过函数调用是变量的值发生变化,在其它函数中可以使用这些改变了的值的目的。

18、fun5()也是正确的,这是引用的重要应用之一。对于引用的操作实际上是作用在引用所因的对象上。

19、在函数中的参数,并不是调用者的变量,而是临时申请的变量a和b存放main函数中变量a和b的值,并在函数中用来计算,在fun中给a和b赋值都是在操作这两个临时申请的变量,函数返回后,这两个变量被舍弃,函数调用也没有将这两个临时变量的值返回给main函数中调用使用的参数功能。

20、所以,在函数中要操作调用者申请的变量,需要给出它们的指针,函数中用指针来找到这些变量的位置和内容。

七、c语言为什么要有指针呢

1、因为指针通过地址传递参数,如果不用指针传送速度慢。

2、在没有C++语言的年代,没有面向对象、模板的语法支持,struct中还不能定义函数,用C语言想要对业务功能(算法,此处即指函数)进行抽象,不想依赖具体的数据结构/数据类型,此时就必须用指向函数的指针来实现抽象与具体的分离,

3、该函数的入参可以是void*,这样调用者就可以传入任意类型的参数了。后来有了C++,就用类成员函数和泛型(模板+functor)来代替了,这样做有更强的静态类型检查机制和编程约束,有利于减少滥用风险。

4、函数指针的一个典型应用场合是实现回调,因为此时还不知道具体函数定义,事件发生时才调用、才确定;类比于面向对象中的“多态”+设计模式中的“观察者模式”,回调的实质仍然是抽象。

5、C语言程序开发中,数组指针是有其独特的作用的,它可以用于限制函数接收指针索引的内存长度,利用编译器规范程序项目。在定义数组指针时,利用C语言的typedef关键字常常能够使代码更加易读:

6、void transform(Vector3d*vector);

7、/* equivalent to `void transform(int(*vector)[3])`*/

c语言为什么要用指针的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于C语言开发指针用的多吗、c语言为什么要用指针的信息别忘了在本站进行查找哦。