指针和引用的区别
展开全部
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]
=; 那么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)=;
for(int i=0;i<2;i++)
{
aa[i](i); //通过函数指针循环调用里面的函数
}
关于各种指向函数指针的声明,请自己查阅有关资料。
引用:
引用相当于别名,其实你直接将其当做一个别名就可以了。引用与指针的区别: 引用必须初始化,而且初始化之后不可更改,指针
却可以。
你好。
指针: 其实指针这个概念在谭浩强的<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]
=; 那么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)=;
for(int i=0;i<2;i++)
{
aa[i](i); //通过函数指针循环调用里面的函数
}
关于各种指向函数指针的声明,请自己查阅有关资料。
引用:
引用相当于别名,其实你直接将其当做一个别名就可以了。引用与指针的区别: 引用必须初始化,而且初始化之后不可更改,指针
却可以。
展开全部
1. 指针是一个实体,而引用仅是个别名;
2. 引用使用时无需解引用(*),指针需要解引用;
3. 引用只能在定义时被初始化一次,之后不可变;指针可变;
引用“从一而终” ^_^
4. 引用没有 const,指针有 const,const 的指针不可变;
5. 引用不能为空,指针可以为空;
6. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;
typeid(T) == typeid(T&) 恒为真,sizeof(T) == sizeof(T&) 恒为真,但是当引用作为类成员名称时,其占用空间与指针相同4个字节(没找到标准的规定)。
7. 指针和引用的自增(++)运算意义不一样;
2. 引用使用时无需解引用(*),指针需要解引用;
3. 引用只能在定义时被初始化一次,之后不可变;指针可变;
引用“从一而终” ^_^
4. 引用没有 const,指针有 const,const 的指针不可变;
5. 引用不能为空,指针可以为空;
6. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;
typeid(T) == typeid(T&) 恒为真,sizeof(T) == sizeof(T&) 恒为真,但是当引用作为类成员名称时,其占用空间与指针相同4个字节(没找到标准的规定)。
7. 指针和引用的自增(++)运算意义不一样;
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
指针和引用的联系与区别
★ 相同点:
1. 都是地址的概念;
指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。
★ 区别:
1. 指针是一个实体,而引用仅是个别名;
2. 引用使用时无需解引用(*),指针需要解引用;
3. 引用只能在定义时被初始化一次,之后不可变;指针可变;
4. 引用没有 const,指针有 const;
5. 引用不能为空,指针可以为空;
6. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;
7. 指针和引用的自增(++)运算意义不一样;
8.从内存分配上看:程序为指针变量分配内存区域,而引用不需要分配内存区域。
详细的请看参考资料
★ 相同点:
1. 都是地址的概念;
指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。
★ 区别:
1. 指针是一个实体,而引用仅是个别名;
2. 引用使用时无需解引用(*),指针需要解引用;
3. 引用只能在定义时被初始化一次,之后不可变;指针可变;
4. 引用没有 const,指针有 const;
5. 引用不能为空,指针可以为空;
6. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;
7. 指针和引用的自增(++)运算意义不一样;
8.从内存分配上看:程序为指针变量分配内存区域,而引用不需要分配内存区域。
详细的请看参考资料
参考资料: http://blog.csdn.net/lyd_253261362/archive/2009/07/06/4323691.aspx
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
引用:从变量上面“引”出一个针或者更加形象一点叫“拉”,一个变量可以引出的无限的针。
指针:用一个针刺向一个变量,一次只能刺向一个变量。
可以总结一下:不论是指针也好,引用也罢,都不过是一个针罢了。所谓的针其本质都是地址的记录器。
需要注意的是引用和变量是连为一体的,引用产生于变量,不像指针那样可以单独分开。
指针:用一个针刺向一个变量,一次只能刺向一个变量。
可以总结一下:不论是指针也好,引用也罢,都不过是一个针罢了。所谓的针其本质都是地址的记录器。
需要注意的是引用和变量是连为一体的,引用产生于变量,不像指针那样可以单独分开。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
指针是一个变量的地址,
引用是一个变量的别名。
例:int a=10;//a存放在存储空间的地址为:0x000009
int &b=a;//b就是a的引用,此时b 的值也为10
int *ptra=&a;//ptra就是a的指针,其值为0x000009
引用是一个变量的别名。
例:int a=10;//a存放在存储空间的地址为:0x000009
int &b=a;//b就是a的引用,此时b 的值也为10
int *ptra=&a;//ptra就是a的指针,其值为0x000009
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询