![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
C语言中的指针到底有什么用
不要给我复制百度百科,我要大白话。虽然说没有指针的话数组和字符串都起不到效果,但是C#里就没有指针啊,照样功能强大啊。指针真是太冗杂了...
不要给我复制百度百科,我要大白话。虽然说没有指针的话数组和字符串都起不到效果,但是C#里就没有指针啊,照样功能强大啊。指针真是太冗杂了
展开
14个回答
展开全部
所有变量值保存在内存中,而每个内存都有一个地址,所谓地址就是一个整数编号,如同门牌号码用于定位(专业术语叫寻址),一个地址对应一个字节(8bit)的内存单元。
如今的编译器,一个整数int类型的值占用32位bit,也就是4字节,编译器将第一个字节的编号定义为该整数的地址,由于保存地址的变量就像一个箭头指向某地址,而称为指针变量。
int a =10; //定义一个整数变量a,对其赋值10
int *p =&a;//定义一个指针变量p,对其赋值a的内存地址,&符号意思为引用跟随其后的变量地址。
cout <<a<<endl; //输出 a的值:10
cout << p << endl ;// 输出p的值:XXXXX 其实为a的地址,该地址由编译器和运行时确定。
cout << *p <<endl; //输出p指向的地址中的值:10,也就是a的值,*星号放在变量前面意思就是取该变量中的地址所指内存中的值。
读取过程为:p的值(a的地址)->寻址->取值
由于指针是一个变量的首个字节的地址,所以要告诉编译器被指地址包含连续多少个字节,因此指针也有类型。比如上面例子中声明了p指针是个整数指针,这样编译器知道p指向一个4字节的内存块。
你可以将指针变量看做一般的整数变量来理解,用来保存一个整数(地址是个整数),只是,该整数代表着某地址,在这里是a的地址。
在C/C++中很灵活,但是也很危险,也很难学,如果指针指向错误的地址会引起程序崩溃,因此在C#中已经被微软封装了,但内部还是有指针的。
如果有必要,C#中也可以使用指针,使用非安全代码,在项目生成选项卡中勾选“允许非安全代码”,然后就可以使用指针了,不过不建议这么做。
unsafe
{
int a = 10;
int* p=&a;
}
如今的编译器,一个整数int类型的值占用32位bit,也就是4字节,编译器将第一个字节的编号定义为该整数的地址,由于保存地址的变量就像一个箭头指向某地址,而称为指针变量。
int a =10; //定义一个整数变量a,对其赋值10
int *p =&a;//定义一个指针变量p,对其赋值a的内存地址,&符号意思为引用跟随其后的变量地址。
cout <<a<<endl; //输出 a的值:10
cout << p << endl ;// 输出p的值:XXXXX 其实为a的地址,该地址由编译器和运行时确定。
cout << *p <<endl; //输出p指向的地址中的值:10,也就是a的值,*星号放在变量前面意思就是取该变量中的地址所指内存中的值。
读取过程为:p的值(a的地址)->寻址->取值
由于指针是一个变量的首个字节的地址,所以要告诉编译器被指地址包含连续多少个字节,因此指针也有类型。比如上面例子中声明了p指针是个整数指针,这样编译器知道p指向一个4字节的内存块。
你可以将指针变量看做一般的整数变量来理解,用来保存一个整数(地址是个整数),只是,该整数代表着某地址,在这里是a的地址。
在C/C++中很灵活,但是也很危险,也很难学,如果指针指向错误的地址会引起程序崩溃,因此在C#中已经被微软封装了,但内部还是有指针的。
如果有必要,C#中也可以使用指针,使用非安全代码,在项目生成选项卡中勾选“允许非安全代码”,然后就可以使用指针了,不过不建议这么做。
unsafe
{
int a = 10;
int* p=&a;
}
![](https://ecmc.bdimg.com/public03/b4cb859ca634443212c22993b0c87088.png)
2024-08-21 广告
C语言在线编译是一种便捷的开发方式,它允许开发者无需在本地安装编译器即可快速编写、编译并运行C语言代码。用户可以通过在线IDE(集成开发环境)平台,直接在网页上编写C代码,并实时查看编译结果和程序输出。这种方式特别适合初学者学习编程或进行小...
点击进入详情页
本回答由MarsCode提供
展开全部
指针起的作用是标识一块内存。电脑内存上的每一个字节都具有一个编号,称为地址(可以简单理解为指针),任何读写内存的指令都必须携带地址信息,否则电脑不知道读写那块内存。不管你的程序是用什么语言写的,要运行数据和代码必须驻留内存,CPU要执行指令必须有一个“指针”(程序计数器)指向内存的代码块,如果某个指令要操作内存数据,该指令必须携带额外的地址信息。
C语言的指针让程序员具备直接操作和管理内存的能力,这个能力也是C语言适合编写底层软件的原因之一。现在拿得出手的操作系统都是用C语言(有时也用C++)和汇编语言编写的。在底层软件领域C语言是占统治地位的。
C语言对内存的操作都是通过指针来实现的,虽然C语言可以通过变量名访问内存,但是编译过后变量名被转换为地址。
其他语言虽然没有指针或者地址概念,但是访问内存是需要地址的,所以与地址相关的底层操作由该语言的运行时库承担了,对程序员来说,地址就“不存在了”。
C语言的指针让程序员具备直接操作和管理内存的能力,这个能力也是C语言适合编写底层软件的原因之一。现在拿得出手的操作系统都是用C语言(有时也用C++)和汇编语言编写的。在底层软件领域C语言是占统治地位的。
C语言对内存的操作都是通过指针来实现的,虽然C语言可以通过变量名访问内存,但是编译过后变量名被转换为地址。
其他语言虽然没有指针或者地址概念,但是访问内存是需要地址的,所以与地址相关的底层操作由该语言的运行时库承担了,对程序员来说,地址就“不存在了”。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
指针其实是某些处理的鼻祖 c#或者java里面没有指针 但是有引用 其实引用就是指针的一种封装形式 你觉得有了c这种高级语言 汇编语言甚至机器语言就是否没用了呢? 指针非常灵活强大 但是用起来确实非常容易出错 c语言毕竟不支持引用或者其他的变相指针形式 要用c的话一切就要用纯指针实现(纯指针可以节省封装所用的资源 加快处理速度 提高程序效率) 就像嵌入式的内核或者操作系统内核要用c 不用java一样 有的时候稳定性和可靠性是第一考虑 但是有的时候 高效才是第一考虑 而稳定性需要靠程序猿手动实现(而不依赖程序的某些try catch 这种东西)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2014-03-09
展开全部
C#也有指针,只是它是面向对象的,有着大量的封装,在C#里指针(*)变成了引用(ref)、(a->b)变成了(a.b)。指针就是地址,把一个内存单元画成正方体(画在纸上能可见3个面),上面分别标注: 变量名、地址、值。这就形象多了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
指针实际上就是一个内存地址,比如一个函数指针,就是一个函数的入口地址,通过这个地址,系统就可以找到这个函数的位置并调用它。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询