C语言中指针和引用的区别

作者&投稿:鞠种 (若有异议请与网页底部的电邮联系)
java引用与C语言指针的区别是什么?~

java引用与C语言指针的区别有以下几方面:
1、现象
指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变,总是指向最初的对象。
2、编译
程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变量名及变量所对应地址。指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值。符号表生成后就不会再改,因此指针可以改变指向的对象(指针变量中的值可以改),而引用对象不能改。
3、类型
引用其值为地址的数据元素,java封装了的地址,可以转成字符串查看,长度可以不必关心;C指针是一个装地址的变量,长度一般是计算机字长,可以认为是个int。
4、内存占用
所占内存:引用声明时没有实体,不占空间。C指针如果声明后会用到才会赋值,如果用不到不会分配内存。
5、内存溢出
JAVA引用的使用权限比较小,不会产生内存溢出。C指针是容易产生内存溢出的,所以程序员要小心使用,及时回收。
6、本质
JAVA中的引用和C中的指针本质上都是想通过一个别名,找到要操作的目标(变量对象等),方便在程序里操作。所不同的是JAVA的办法更安全,使用更加方便些,但没有了C的灵活,高效。

1) 引用必须被初始化,指针不必。
2) 引用初始化以后不能被改变,指针可以改变所指的对象。
3) 不存在指向空值的引用,但是存在指向空值的指针。
C++中尽量用引用。个人觉得所有的引用都可以用指针,但指针比引用容易出错。
引用当然更直观更直接,做参数时,如果在函数内不刻意要用指针的那些副作用(如越界访问,动态定向什么的),引用可以代替指针。

指针,全称为指针变量,是用来存储内存地址的一种变量。程序中,一般通过指针来访问其指向的内存地址中的内容(数据)。

引用,是C++中提出来的一种新的使用变量的方式,即,给实际变量起个别名,通过这个别名来引用实际的变量。标准C中不支持变量的引用。

这两个概念没有任何相关性。

指针是实实在在的变量,有自己的内存存储空间,它可以指向任何有效的变量。

引用是一种形式、方法,定义的引用变量,实际上是原实际变量的另一个名称(别名),引用变量本身没有自己的实际存储空间,操作引用变量,就是在操作实际变量。

如:



ct9789:
你好。
指针: 其实指针这个概念在谭浩强的<C程序设计>这本书上是这样说的,指针就是地址,指针值就是地址值。指针变量就是存放指针的

变量,所以一定不要将指针与指针变量搞混淆了。指针仅仅是一个地址值,而指针变量就是存放指针(也就是地址的变量)

指针的定义:
例如整型指针: int *p;p是一个指向int类型数据的指针变量。里面存放的地址(也就是指针)是一个int类型变量的地址。指针变量时

有类型的,例如p的类型就是int *表示p是一个指向int类型的指针变量。如何知道一个指针变量的类型呢,最简单的方法就是去掉变

量定义语句中的变量名,剩下的部分就是其类型,这种方法适用于所有的变量定义,例如int a;a的类型是int 。 int b[10];b的类

型是int[]表示是一个数组(关于数组类型这里不谈,因为这个问题很微妙,其实在c、c++中没有数组类型这个概念,包括函数类型也

是一样的),int *c;c的类型是int *。int ** d;d的类型就是int **;所以通过这种方法来判断一个变量的类型是很方便的。

说道指针变量,我们必须说到得有几个方面。

1.指针类型。

这个很重要,一个指针是有类型的,也就是一个地址是有类型的。具体说是某一个地址会指向不同类型的数据,这是不一样的,例如

int *p;p是指向int型数据。 double*p1;p1是指向double型数据。但是p和p1本身在内存中占用的空间是4个字节(对于32位的系统来说

),如果是在TC中编译c程序,应该是2个字节了(dos操作系统是16位的)。有人说地址不就是一个值吗,类似于0xfffdddcc这样的地址

数值,为什么还分什么类型呢,我要说的是这个关系很大。我们知道指针是有运算的,int *p=&a;那么p++到底加了多少呢,不要以为

是将p里面的地址值加了1,这是完全想当然。实际上加了sizeof(int)这么多个字节。也就是说加了一个int元素应该占用的字节,这

样在数组中我们可以通过这种方式从上一个元素很方便的让指针变量指向下一个元素。p+5的话实际上是加了p+sizeof(int)*5这么多

个字节。 另外一点事指针的类型决定了当指针解引用的时候其所以指向的内存单元中的二进制数据如何解释的问题。例如int *p=&a;

那么(*p)取得的数字就是一个整型数据,如果(*((char *)p))得到的就是一个字符型数据了。p本来指向的是int型数据(有4个字节)的

首地址,如果将其强制转换为一个指向char类型的指针变量,那么在解引用的时候只取第一个字节的数据,并将其解释为一个ascii码

代表的字符。 还有如果是一个指向函数的指针变量,我们可以通过此指针变量直接调用函数。例如int(*function)(int);此时

function指向一个函数,此函数具有一个int参数,返回一个int值。那么通过指针可以这样调用该类型的函数了int a=function

(100); 或者int a=(*function)(100);其实要不要解引用都是可以的。不过以前是需要解引用的,现在c标准规定这两种方法都可以。

总的来说指针的类型很重要。

2.指针与数组。

我们向一个函数传递数组的时候一般是传递数组名,我们知道数组名是一个代表数组中第一个元素的地址并且数组名是不可以当左值

的。其实你又没有想过数组名到底是什么呢。有人说其实数组名就是一个指针常量,是一个不可以改变的指针常量。例如:int a[10]

={1,2,3,4,5,6,7,8,9,10}; 那么a可能的类型是int * const a;注意const的位置(关于指针常量和常量指针,这个以后说),那么这种

说法到底对不对呢。我们可以通过sizeof运算符来计算某一种数据类型占用的存储空间。例如 sizeof(10)的值为4,注意这里我都假

设在32位的操作系统上面编译。其实sizeof(10)和sizeof(int)是一样的,仅仅是求这种类型的数据占用多少内存空间,而不是说具体

的某个数据占用的空间,因为对于10这个文字常量来说根本不会占用内存空间的,其实随着程序直接编码到源程序中的,不存在分配

内存的问题。那么我们这样计算sizeof(a);是不是如我们所愿得到的是4呢。 结果可能会有意外,因为其值是sizeof(int)*10也就是

40个字节,显然这个字节数是整个数组占用的字节数。而不是int *类型的指针变量占用的字节数,我们知道一个地址只占用4个字节

那么这说明数组名绝对不是简单的int*类型。但是数组确实具有int*的特性。例如int*p=a;这是不会报错的。而且在函数之间传递的

时候也是采用这样的方式:
void print(int b[10]){}
调用函数:
print(a);
或者:
print(&a[0]);
都是一样的。

注意在某一个函数内对形参进行sizeof:
void print(int c[100])
{
sizeof(c); // 此时表达式的结果是4,而不是100。因为这里int c[100]与int *c是一样的,c不是数组名(数组名是不能作为左值

的)
}

3. 指针与函数

一个指针可以指向一个函数,指针可以作为函数参数,函数可以返回一个指针类型的数据。

指向函数的指针: 指向函数的指针,实际上此指针就是函数代码的入口地址。我们可以通过这样的方式调用函数。例如:

void print1(int x)
{
cout<<"hello "<<x<<endl;
}

void print2(int y)
{
cout<<"hello "<<y<<endl;
}

那么在main函数中可以这样写:

void (*p)(int)=print1;//函数名代表函数入口地址值,和数组一样,print1不仅仅是一个地址。

p(10);

p=print2;

p(20);

这都是可以的,另外我们可以通过一个指针数组存放指向函数的指针:

void (*aa[2])(int)={print1,print2};

for(int i=0;i<2;i++)
{
aa[i](i); //通过函数指针循环调用里面的函数
}

关于各种指向函数指针的声明,请自己查阅有关资料。

引用:

引用相当于别名,其实你直接将其当做一个别名就可以了。引用与指针的区别: 引用必须初始化,而且初始化之后不可更改,指针
却可以。

首先, 在Java中, 不存在引用传递(也就是地址传递)一说, 全部都是值传递, 自然, 在使用对象时实际上都是使用的引用

Java语言明确说明取消了指针,因为指针往往是在带来方便的同时也是导致代码不安全的根源,同时也会使程序的变得非常复杂难以理解,滥用指针写成的代码不亚于使用早已臭名昭著的"GOTO"语句。Java放弃指针的概念绝对是极其明智的。但这只是在Java语言中没有明确的指针定义,实质上每一个new 语句返回的都是一个指针的引用,只不过在大多时候Java中不用关心如何操作这个"指针",更不用象在操作C++的指针那样胆战心惊。

非也,基本类型数据存放在Stack中,存放的是数据。而产生对象时,只把对象的reference存放在stack中,用于指向某个对象,对象本身存放在Heap中。

还有, 调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。其他变量,如静态变量、实例变量等,都在堆(Heap)中创建,速度较慢。另外,依赖于具体的编译器/JVM,局部变量还可能得到进一步优化。

从实现上来讲,引用可以理解为一种受限的指针,引用底层可以采用指针来实现,也可以采用句柄的方式实现。早期jvm一般采用句柄的方式,现在的jvm,比如sun的,IBM的,一般就是用指针来实现。

不过从语言的角度来将,没有必要把java的引用和C的指针来比较。

指针是可以进行与整数做加减运算的,两个指针之间也可以进行大小比较运算和相减运算。

引用不行,只能进行赋值运算。

当然有区别

A a=new A();

你可以 a=a+1;吗? 指针就可以

我建议你还是去看看 c++primer 这本书,专门有一小节是讲指针和引用的区别的。
大师的书才是真理,别在这里被误导了~~~~

引用是C++中才加入的概念。


从Java出身的程序员浅谈Go指针和赋值引用
在Go里,和数组很相似的一个数据结构是Slice,但切片本质是一个结构体,即引用类型而非值类型,这意味着它的变量并不是切片本身而是指向它,或者说,值是能找到切片本身的地址值。所以,如果你想使用函数调用来修改切片,你甚至连指针都不需要,直接修改就是结构体本身。然而,这是否意味着Go语言存在值...

c语言中关于*和&的意思理解
代表指针运算符和乘法运算符;&代表取地址,与运算符,引用符。用于二目运算中的按位(位运算)与运算:单目是只需要一个操作数的意思,比如:a++ a-- *a &a 双目是需要两个操作数的意思,比如:a+b a-b a*b a\/b a%b 三目是需要三个操作数的意思,比如:a=c>b?c:b;例如...

C++ & QT ---05(内存、指针、引用、函数高级)
函数重载允许使用相同的函数名实现不同功能,以提高代码的复用性,关键在于满足一定的条件,例如在同一作用域下、函数名称相同、参数类型、个数或顺序不同。至此,C++核心编程的内存、指针、引用和函数高级概念得到了全面的介绍,这些基础原理是深入理解C++语言和编写高效、可维护的代码的关键。

1. 用普通,指针和引用三种方法实现传递参数,他们的区别是什么,他们的...
此时,我们在test函数中,就可以根据p保存的地址0x77777来修改这个内存单元中的值,就达到了修改a的目的 。3. 引用传递 int a = 5;int &b = a; \/\/ a的引用 这个其实类似第2种方法,也是传递了地址,b相当于给a取了一个别名。谭浩强书中所指的值传递和引用传递其实都是值传递,那样写书确实...

为什么利用指针时,定义函数要用*,而调用函数时要用&
你可以这么理解:指针定义完后即定义了一个指向某个地址的变量,这种变量只能存放地址信息,C语言用"*"来跟其它一般的变量进行区分,只是当你定义这个变量时这个地址还未确定,因此,当你将指针作为形参时,只需要帮它指向一个确定的地址,那么指针就可以正确的取到所需要的数。而“&”就是这个功能,取...

请问c语言中引用怎样理解?
Point &pt3;pt3=pt1;2、引用的两个主要用途 作为函数参数以及从函数中返回左值。(1)引用参数 a、传递可变参数 传统的c中,函数在调用时参数是通过值来传递的,这就是说函数的参数不具备返回值的能力。所以在传统的c中,如果需要函数的参数具有返回值的能力,往往是通过指针来实现的。比如,实现...

c语言参数是什么意思
在C语言中,参数有两种类型:值参数和引用参数。值参数传递的是函数调用时的实际值,这些值在函数内部被复制并用于计算。而引用参数则通过指针或引用传递,函数可以直接修改外部变量或对象。这两种参数也可以按入参和出参划分。入参是指从主调函数传递到被调函数中的数值或地址变量,而出参则是将被调...

为什么c语言中,指针指向字符串不用解引用?
字符串的指针实际上是字符指针,可以指向字符串中任何一个字符的位置。

论述C语言中指针的概念和作用,并举例说明
int p;\/*定义一个指针变量P*\/ p=&a;\/*让p指向a的首地址,也就是a的地址*\/ 程序为a分配一个2个字节的存储单元,假如2个字节的地址分别为(ABCD1和ABCD2,唯一),那么p里面放的值就是ABCD1,不是3。这时可通过p直接引用a,实际上*p=3。以后不管a存放在内存中的哪个地方,只用通过调用p就...

c语言指针引用数组元素,从p=a开始解释下此程序
当初始化数组a完成后,3. p=a; \/\/使指针p重新指向数组a的首元素,即指向a[0]。4. 第二个for循环,就是通过指针p输出数组a的所有元素到屏幕上了。总结,通过指针来操作对象,是一种间接访问变量的方式,有很多的好处,这在以后的编程学习中你会慢慢体会到指针的妙处和精髓。

金阊区13291593210: C语言中引用及指针和引用的联系与区别 -
霍唐百合: C语言中引用和指针的用法很相似,在做函数参数时都是传递变量的地址,而不是传递一个变量的副本,都可以返回对参数变量的修改.主要区别在于参数的传递形式上.指针的形式类似于 : int *pInt; 引用的形式类似于 : int &pInt;

金阊区13291593210: 浅谈C++中引用和指针的区别 -
霍唐百合: 本质:引用是别名,指针是地址,具体的:①从现象上看,指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变.这句话可以理解为:指针可以被重新赋值以指向另一个不同的对象.但是引用则总是指向在初始化时...

金阊区13291593210: C 中的指针 和 C#中的引用 有和异同点 请各路大神详解 跪谢!! -
霍唐百合: 区别(1)引用总是指向一个对象,没有所谓的 null reference .所有当有可能指向一个对象也由可能不指向对象则必须使用 指针.由于C++ 要求 reference 总是指向一个对象所以 reference要求有初值.String & rs = string1;由于没有所谓的 null reference 所以所以在使用前不需要进行测试其是否有值.,而使用指针则需要测试其的有效性.(2)指针可以被重新赋值而reference则总是指向最初或地的对象.

金阊区13291593210: 指针与引用有什么区别 -
霍唐百合: C语言里面有指针没有引用,C++有指针和引用.引用在底层实现上其实就是const指针,即指针常量,指向的地址不能变(指针本身不能改变),但是指向的地址的值可以改变,改变引用就是改变指向地址的值,在使用时不用在前面加*号.所以可以说引用是一种特殊的指针.

金阊区13291593210: 函数形参 引用和指针有什么区别 -
霍唐百合: 指针是用来指向某个变量,而引用是给变量取个别名,其作用就如同typedef一样.用引用作形参时在调用函数里就像操作实参一样,不需要考虑实参的地址问题用指针做形参时,由于指针的值是变量的地址,所以要通过对地址解引用来操作其所指的变量.在C++里优先选择引用类型作为形参,因为操作一个变量比操作一个指针要简单的多 但用指针作为形参的好处是它可以通过自增或自减改变它的指向.温馨提示:建议调用函数时,用引用类型的形参!

金阊区13291593210: C++中引用与指针的区别 -
霍唐百合: C++中指针与引用的区别:1.定义和性质的区别:(1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已.如: int a=1;int ...

金阊区13291593210: c++中引用和指针的区别,引用的优势在哪 -
霍唐百合: 引用与指针的主要区别有:1、引用是变量a的别名,而指针是存储变量a的地址.2、引用必须初始化,不能为空,指针可以.3、引用初始化后不能更改,指针可以.4、引用没有const一说,指针有可以被const修饰.5、引用只能是一级的,即&b,不能出现&&b, 指针可以.6、引用和指针在运算的时候,也是有区别的,例如++操作.引用优势:1、引用在做参数传递时,实际传递的就是变量本身,所以可以直接对变量进行更改.而指针作为参数传递时,传递的是变量的地址,这就需要根据地址取出变量,然后在对变量操作.引用相对指针而言,节约时间.2、引用只是变量别名,与变量共用内存空间,而指针需要额外的内存空间来存储变量的地址,所以引用相对指针而言,节约空间.

金阊区13291593210: C语言中的指针和C++中的引用区别有哪些? -
霍唐百合: 1) 引用必须被初始化,指针不必.2) 引用初始化以后不能被改变,指针可以改变所指的对象.3) 不存在指向空值的引用,但是存在指向空值的指针. C++中尽量用引用.个人觉得所有的引用都可以用指针,但指针比引用容易出错. 引用当然更直观更直接,做参数时,如果在函数内不刻意要用指针的那些副作用(如越界访问,动态定向什么的),引用可以代替指针.

金阊区13291593210: 不同版本的C语言指针操作符和引用操作符有哪区别? -
霍唐百合: 首先说明C语言没有引用的概念,而VC++2005只是一款C++编译器而已,所以讨论引用的问题只是在C++中.引用可以被认为是一个变量的别名,引用在定义时必须指定其所引用的原变量且不可以修改.与指针的关系,可以认为引用是一个不需要逆向引用(*)就可以对变量进行访问的常量指针.简单例子:int a=5; int &ra=a; int *pa=&a; 则下面的操作是相同的效果 ra=3;*p=3;

金阊区13291593210: 使用引用和使用指针变量作函数形参有什么不同 -
霍唐百合: 区别不大;在函数中;都能达到改变传入值的目的;但是 1指针可以 再指向别处;2指针可以const修饰;让其不能修改传入参数的值;3 sizeof 得到的大小不一样;4 ++运算的意义不一样;

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网