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;
}
展开全部
指针起的作用是标识一块内存。电脑内存上的每一个字节都具有一个编号,称为地址(可以简单理解为指针),任何读写内存的指令都必须携带地址信息,否则电脑不知道读写那块内存。不管你的程序是用什么语言写的,要运行数据和代码必须驻留内存,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个面),上面分别标注: 变量名、地址、值。这就形好敬象扒让多了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
指针实际上就是一个内存地址,比如一个函数指针,让卖就或顷是一个函数的入口地址,通过这个地址,坦团逗系统就可以找到这个函数的位置并调用它。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询