C/C++中指针和引用之相关问题深入研究

一、基本知识
指针和引用的声明方式:
声明指针: char* pc;
声明引用: char c = 'A'
   char& rc = c;

它们的区别:
①从现象上看,指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变。这句话可以理解为:指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变,但是指定的对象其内容可以改变。

②从内存分配上看,程序为指针变量分配内存区域,而不为引用分配内存区域,因为引用声明时必须初始化,从而指向一个已经存在的对象。引用不能指向空值。

③从编译上看,程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变量名及变量所对应地址。指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值。符号表生成后就不会再改,因此指针可以改变指向的对象(指针变量中的值可以改),而引用对象不能改。这是使用指针不安全而使用引用安全的主要原因。从某种意义上来说引用可以被认为是不能改变的指针。

④不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。相反,指针则应该总是被测试,防止其为空。

⑤理论上,对于指针的级数没有限制,但是引用只能是一级。

如下:


代码如下:

int** p1; // 合法。指向指针的指针
  int*& p2; // 合法。指向指针的引用
  int&* p3; // 非法。指向引用的指针是非法的
  int&& p4; // 非法。指向引用的引用是非法的

注意上述读法是从左到右。

程序1:


代码如下:

#include "stdio.h"
int main(void)
{
  // 声明一个char型指针pc,且让它指向空值
  char* pc = 0;
  char a = 'a';
  // 声明一个引用rc,且让它引用变量a
  char& rc = a;
  printf("%d, %c\n", pc, rc);

char *pc2;
  // 声明一个指针,但可以不初始化
  pc2 = pc;

// char& rc2;
  // 上面语句编译时,会产生如下错误:
  // error C2530: 'rc2' : references must be initialized
  // 即,应用必须初始化
  // rc = *pc;
  // 上面语句编译不会有问题,但运行时,会报如下错误:
  // "0x00401057"指令引用的"0x00000000"内存。该内存不能为"read"
  // 说明引用在任何情况下,都不能指向空值

return 0;
}

程序2:


代码如下:

#include <iostream>
#include <string>
using namespace std;
int main(void)
{
  string s1("Hello");
  string s2("World");
  // printf("%s\n", s1); 不能用printf输出s1,而应该用cout

cout << "s1的地址 = "<< &s1 << endl;// &s1 = 0012FF64
  cout << "s2的地址 = "<< &s2 << endl;// &s2 = 0012FF54

string& rs = s1;   // 1. 定义一个引用rs,rs引用s1
  cout << "引用rs的地址 = " << &rs << endl;  // &rs = 0012FF64

string* ps = &s1; //定义一个指针ps, ps指向s1
  cout << "指针ps的地址 = " << ps << endl;// ps = 0012FF64

cout << rs << ", " << *ps << endl;  // Hello, Hello
  // 如果没有#include <string>,上面的语句在编译的时候,会出现如下错误:
  // error C2679: binary '<<' : no operator defined which takes a right-
  // hand operand of type 'class std::basic_string<char,struct
  // std::char_traits<char>,class std::allocator<char> >'
  // (or there is no acceptable  conversion)

rs = s2;  // 2. rs仍旧引用s1, 但是s1现在的值是"World"
  ps = &s2;   // ps现在指向s2

cout << "引用rs的地址 = " << &rs << endl;  // &rs = 0012FF64 未改变
  cout << "引用rs的值 = " << rs << endl;   // rs = "World" 已改变

cout << "指针ps的地址 = " << ps << endl;// ps = 0012FF54  已改变
  cout << "指针ps所指地址的内容 = " << *ps << endl;  // *ps = World已改变

cout << "s1的地址 = "<< &s1 << endl;// 3. &s1 = 0012FF64 未改变
  cout << "s1的值 = " << s1 << endl; // 4. s1 = World  已改变

return 0;
}

可以认为:
引用就是变量的别名,在引用初始化的时候就已经确定,以后不能再改变。见程序2的粗体字语句。第1句,声明了rs引用s1,s1的值为”Hello”,从这以后,rs实际上就相当于变量s1了,或者从更本质的意义上来说,rs的地址就是初始化时s1的地址了,以后都不会再改变。这应该比较好理解,比如我们在程序中定义了一个变量a,不管我们如何给a赋值,但它的地址是不会改变的;

第2句,rs仍旧指向初始化时s1的地址,但此处的赋值就相当于重新给s1赋值,因此我们从第3句和第4句可以看到,s1的地址并没有发生变化,但是其值已经发生了变化。

二、作为参数传递
利用引用的这个特性,可以用它作为函数的传出参数。如程序3:


代码如下:

#include <iostream>
#include <string>
using namespace std;
int newEvaluation(string& aStr)
{
  string bStr("Hello,");
  aStr = bStr + aStr;

return 0;
}

int main(void)
{
  string aStr("Patrick!");
  newEvaluation(aStr);
  std::cout << aStr << endl; // 输出结果:"Hello, Patrick!"

return 0;
}

而一般变量,则不能从函数内部传值出来,比如程序4:


代码如下:

#include <iostream>
#include <string>
using namespace std;

int newEvaluation(string aStr)
{
  string bStr("Hello,");
  aStr = bStr + aStr;

return 0;
}

int main(void)
{
  string aStr("Patrick!");
  newEvaluation(aStr);
  std::cout << aStr << endl; // 输出结果:"Patrick!",aStr的值没有变化

return 0;
}

当然程序3引用传递的方式也可以写成指针传递的方式,如程序5:


代码如下:

#include <iostream>
#include <string>
using namespace std;

int newEvaluation(string* const aStr)
{
  string bStr("Hello,");
  *aStr = bStr + *aStr;

return 0;
}

int main(void)
{
  string aStr("Patrick!");
  newEvaluation(&aStr);
  std::cout << aStr << endl; // 输出结果:"Hello, Patrick!"

return 0;
}

注意程序中的陷井,如程序6:


代码如下:

#include <iostream.h>
int *pPointer;
void SomeFunction()
{
  int nNumber;
  nNumber = 25;
  //让指针指向nNumber
  pPointer = &nNumber;
}

void main()
{
  SomeFunction();//为pPointer赋值
  //为什么这里失败了?为什么没有得到25
  cout << "Value of *pPointer: " << *pPointer << endl;
}

这段程序先调用了SomeFunction函数,创建了个叫nNumber的变量,接着让指针pPointer指向了它。可是问题出在哪儿呢?当函数结束后,nNumber被删掉了,因为这一个局部变量。局部变量在定义它的函数执行完后都会被系统自动删掉。也就是说当SomeFunction 函数返回主函数main()时,这个变量已经被删掉,但pPointer还指着变量曾经用过的但现在已不属于这个程序的区域。

尽管在SomeFunction中使用所谓的动态分配内存。程序7中也存在陷井:


代码如下:

#include <iostream.h>
int *pPointer;

void SomeFunction()
{
int intNumber = 25;
// 让指针指向一个新的整型
pPointer = new int;
pPointer = &intNumber;
}

void main()
{
SomeFunction();   // 为pPointer赋值
cout<< "Value of *pPointer: " << *pPointer << endl;
delete pPointer;
}

原因也如上面所言,intNumber的作用范围仅限于SomeFunction中,离开了SomeFunction,那么intNumber就不存在了,那么&intNumber即intNumber的地址就变得没有意义了,因此,该地址所指向的值是不确定的。如果改为下面的程序就不会有问题了。

程序8:


代码如下:

#include <iostream.h>
int *pPointer;

void SomeFunction()
{
int intNumber = 25;
// 让指针指向一个新的整型
pPointer = new int(intNumber);
}

void main()
{
SomeFunction();   // 为pPointer赋值
cout<< "Value of *pPointer: " << *pPointer << endl;
delete pPointer;
}

三、指针的指针
前面说到,指针是没有级数限制的。
程序9:


代码如下:

#include<stdio.h>
#include<stdlib.h>

void main(void)
{
int i, j;
int a[10], b[3][4], *p1, *p2, **p3;  
for(i = 0; i < 10; i++)
   scanf("%d", &a[i]);

for(i = 0; i < 3; i++)
   for(j = 0; j < 4; j++)
   scanf("%d", &b[i][j]);

p1 = a;
p3 = &p1;
for(i = 0; i < 10; i++)
   printf("%4d", *(*p3+i));
printf("\n");

for(p1 = a; p1 - a < 10; p1++)
{
   p3 = &p1;
   printf("%4d", **p3);
}
printf("\n");

for(i = 0; i < 3; i++)
{
   p2 = b[i];
   p3 = &p2;
   for(j = 0; j < 4; j++)
   printf("%4d",*(*p3+j));
   printf("\n");
}

for(i = 0; i < 3; i++)
{
   p2 = b[i];
   for(p2 = b[i]; p2-b[i] < 4; p2++)
   {
   p3 = &p2;
   printf("%4d", **p3);
   }
   printf("\n");
}
}

输出的结果:
1   2   3   4   5   6   7   8   9   10
1   2   3   4   5   6   7   8   9   10
11  12  13  14
15  16  17  18
19  20  21  22
11  12  13  14
15  16  17  18
19  20  21  22

四、函数指针和函数引用
函数指针是C++最大的优点之一。和使用普通指针相比,高级程序员只要有可能都更愿意使用引用,因为引用更容易处理一些。然而,当处理函数时,函数引用对比函数指针就未必有这个优势了。现有的代码很少使用函数引用。下面将向介绍如何函数指针、如何使用函数引用以及分别在什么情况下使用它们。

① 函数指针的例子


代码如下:

#include <iostream>
void print(int i)
{
std::cout << i << std::endl;
}

void multiply(int& nDest, int nBy)
{
nDest *= nBy;
}

void print_something()
{
std::cout << "something" << std::endl;
}

int sayHello()
{
std::cout << "Hello, World!" << std::endl;
return 10;
}

int main()
{
void (*pFunction_1)(int);
pFunction_1 = &print;
pFunction_1(1);
// 输出结果为1

void (*pFunction_2)(int&, int) = &multiply;
int i = 1;
pFunction_2(i, 10);
std::cout << "i = " << i << std::endl;
// 输出结果为10

void (*pFunction_3)();
pFunction_3 = &print_something;
pFunction_3();
// 输出结果为something

int (*pFunction_4)();
pFunction_4 = &sayHello;
int a = pFunction_4();
// 输出结果为Hello, World!
std::cout << a << std::endl;
// 输出结果为10

return 0;
}

② 函数引用的例子


代码如下:

#include <iostream>
void print(int i)
{
std::cout << i << std::endl;
}

void print2(int i)
{
std::cout << i << std::endl;
}

void multiply(int& nDest, int nBy)
{
nDest *= nBy;
}

void print_something()
{
std::cout << "something" << std::endl;
}

int sayHello()
{
std::cout << "Hello, World!" << std::endl;
return 10;
}

int main()

// void (&rFunction_1)(int);
// 错误:未初始化引用!引用必须初始化

void (&rFunction_2)(int) = print;
rFunction_2(1);
// 输出1

rFunction_2 = print2;
rFunction_2(2);
// 输出2

void (&rFunction_3)(int&, int) = multiply;
int i = 1;
rFunction_3(i, 10);
std::cout << i << std::endl;
// 输出10

void (&rFunction_4)() = print_something;
rFunction_4();
// 输出something

int (&rFunction_5)();
rFunction_5 = sayHello;
int a = rFunction_5();   // 输出Hello, World!
std::cout << a << std::endl;
// 输出10

return 0;
}

③ 函数指针和函数引用作为函数参数


代码如下:

#include <iostream>

void print(int i)
{
std::cout << i << std::endl;
}

void print2(int i)
{
std::cout << i * 2 << std::endl;
}

void printSomething()
{
std::cout << "Something" << std::endl;
}

void sayHello()
{
std::cout << "Hello, World!" << std::endl;
}

void call_p_func(void (*func)(int))
{
func(1);
func(2);
func(3);
}

void call_r_func(void (&func)(int))
{
func(1);
func(2);
func(3);
}

void call_p_function(void (*func)())
{
func();
}

int main()
{
std::cout << "函数指针作为参数" << std::endl;
call_p_func(&print);
call_p_func(&print2);
call_p_function(&printSomething);
call_p_function(&sayHello);
call_p_function(sayHello);
// 上面两句对于某些编译器来说是一样的,但是推荐使用前者的写法,
// 这样可以是程序的可读性更好一些

std::cout << "函数引用作为参数" << std::endl;
call_r_func(print);
call_r_func(print2);

return 0;
}

总结:
函数指针的声明使用方式:
<想要指向的函数之返回类型>(*函数指针的名称)<想要指向的函数之参数类型…>
如要想声明一个函数指针指向以下函数:


代码如下:

void print(int i)
{
std::cout << i << std::endl;
}

那么就可以如下操作:
void (*pFunction)(int);
然后如下用函数的地址给pFunction赋值:
pFunction = &print;
在然后,pFunction就可以和函数print一样使用了,比如,
pFunction(1);
等等。

函数引用的声明和使用方式:
<欲引用的函数之返回类型>(&函数引用的名称)<欲引用的函数之参数类型…>=<欲引用的函数的名称>,至所以如此,是引用在声明的时候必须初始化,引用不能指向空值。
如要想声明一个函数引用指向以下函数:


代码如下:

void print(int i)
{
std::cout << i << std::endl;
}

那么就可以如下操作:
void (&rFunction)(int)=print;
在然后,rFunction就可以和函数print一样使用了,比如,
rFunction(1);
等等。

五、const修饰指针和引用
大致而言,const修饰指针和引用分三种情况,即const修饰指针、const修饰引用和const修饰指针的引用。下面分别讨论之。

① const修饰指针
const修饰指针又分为三种情况,即const修饰指针本身、const修饰指针所指的变量(或对象)以及const修饰指针本身和指针所指的变量(或对象)。

a. const修饰指针本身
在这种情况下,指针本身是常量,不能改变,任何修改指针本身的行为都是非法的,例如:
double pi = 3.1416;
double* const PI = π

double alpha = 3.14;
PI = α   // 错误。因为指针PI是常量,不能再被改变。
*PI = alpha;   // OK。虽然指针PI不能被改变,但指针所指的变量或者对象可变。

b. const修饰指针指向的变量(或对象)
在这种情况下,指针本身可以改变,但const所修饰的指针所指向的对象不能被改变,例如:
double pi = 3.1416;
const double* PI = π

double alpha = 3.14;
*PI = alpha;// 错误。因为PI所指向的内容是常量,因此*PI不能被改变。
PI = α// OK。虽然指针所指的内容不能被改变,但指针PI本身可改变。从而通过这种方式改变*PI。

c. const修饰指针本身和指针所指向的变量(或对象)
在这种情况下,指针本身和指针指向的变量(或对象)均不能被改变,例如:
double pi = 3.146;
const double* const PI = π
//double const* const PI = π
cout << "PI = " << PI << endl;
cout << "*PI = " << *PI << endl;

double alpha = 3.14;
//*PI = alpha; // 错误。因为PI所指向的内容是常量,因此*PI不能被改变。
//PI = α // 错误。因为指针PI是常量,不能再被改变。

② const修饰引用
const修饰引用没有指针修饰指针那么复杂,只有一种形式。引用本身不能被改变,但所指向的对象是可以被改变的,见上面“一、基本知识”。
double pi = 3.1416;
//const double& PI = pi;
double const& PI = pi;  //和上面一句是等价的
//double& const PI = pi;//有问题。很多编译器会产生warning
cout << PI << endl;

③ const修饰指针引用
我们用例子来说明。
double pi = 3.14;
const double* pPI = π
//const double*& rPI = π //错误。不能将double* 转换成const double *&
const double*& rPI = pPI;   //OK。声明指针引用的正确方法

说明:const double*& rPI = π 为什么会出现错误呢?我们知道,引用是被引用对象的别名,正因为如此,由于rPI是pPI的别名,因此rPI和pPI的类型必须完全一致。从上面的代码段我们可以看到,rPI的类型是const double*,而&pi的类型是double*,因此这句程序是错误的。

下面这段代码和 ① 中的b中的情形对应(即内容不可变,指针可变):
double pi = 3.1416;
double api = 3.14;
const double* pPI = π
const double* pAPI = &api;
const double*& rPI = pPI;
const double*& rAPI = pPI;

*rAPI = api; // 错误。指针所指向的值不能被直接改变
rAPI = pAPI;   // OK。指针本身可以被改变

指针引用的用法还有其它的情形,由于罕用,故此不谈及。

(0)

相关推荐

  • 从汇编看c++中引用与指针的使用分析

    首先是引用情形下的c++源码: 复制代码 代码如下: void add(int a, int b, int&c) {    c = a + b;} int main() {    int a = 1;    int b = 2;    int c = 0;    add(a, b, c); } 下面是main对应的汇编码: 复制代码 代码如下: ; 6    : int main() { push    ebp    mov    ebp, esp    sub    esp, 12      

  • 关于c++ 智能指针及 循环引用的问题

    c++智能指针介绍 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete,比如流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见,并造成内存泄露.如此c++引入 智能指针 ,智能指针即是C++ RAII的一种应用,可用于动态资源管理,资源即对象的管理策略. 智能指针在 <memory>标头文件的 std 命名空间中定义. 它们对 RAII 或 获取资源即初始化 编程惯用法至关重要. RAII 的主要原则是

  • C++中指针和引用的区别分析

    从概念上讲.指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量). 在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的: 指针传递参数本质上是值传递的方式,它所传递的是一个地址值.值传递过程中,被调

  • C++ 中引用和指针的关系实例详解

    C++ 中引用和指针的关系实例详解 1.引用在定义时必须初始化,指针没有要求 int &rNum; //未初始化不能通过编译 int *pNum; //可以 2. 一旦一个引用被初始化为指向一个对象,就不能再指向 其他对象,而指针可以在任何时候指向任何一个同类型对象 int iNum = 10; int iNum2 = 20; int &rNum = iNum; &rNum = iNum2; //不能通过 3. 没有NULL引用,但有NULL指针. int *pNum = NULL

  • c++中引用和指针的区别和联系

    C++中的引用和指针 ★ 相同点: 1. 都是地址的概念:指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名(java中的引用其实也是别名的意思). ★ 区别: 1. 指针是一个实体,而引用仅是个别名:2. 引用使用时无需解引用(*),指针需要解引用:3. 引用只能在定义时被初始化一次,之后不可变:指针可变: 引用"从一而终" 4. 引用没有 const,指针有 const,const 的指针不可变:5. 引用不能为空,指针可以为空:6. "sizeof 引用&

  • 详谈C++引用&和指针在作为形参时的区别

    int n; int &m = n; 在C++中,多了一个C语言没有的引用声明符&,如上,m就是n的引用,简单的说m就是n的别名,两者在内存中占同样的位置,不对m开辟新的内存空间,对m的任何操作,对n来说是一样的. 对于引用,有以下三条规则: (1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化). (2)不能有NULL 引用,引用必须与合法的存储单元关联(指针则可以是NULL). (3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象). 假如在一个函数中

  • 简单谈谈C++ 中指针与引用

    指针和引用形式上很好区别,但是他们似乎有相同的功能,都能够直接引用对象,对其进行直接的操作.但是什么时候使用指针?什么时候使用引用呢?这两者很容易混淆,在此我详细介绍一下指针和引用,力争将最真实的一面展现给大家.如果我喷得不够好,希望嘴下留情.手下留命,还请指点一二:如果感觉还不错,请大家鼓掌. 指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一个内存地址,编译器不能通过该指针所指向对象的类型和大小,因此想要通过vo

  • C++ 中指针和引用有什么区别详解

    C++ 中指针和引用有什么区别详解 1.从内存上来讲  系统为指针分寸内存空间,而引用与绑定的对象共享内存空间,系统不为引用变量分配内容空间. 2指针初始化以后可以改变指向的对象,而引用定义的时候必须要初始化,且初始化以后不允许再重新绑定对象. 3.所以引用访问对象是直接访问.指针访问对象是间接访问. 4.如果pa是指针,那么*pa就是引用了. 但是两者在作为形参的时候非常相似,区别是指针拷贝副本,引用不拷贝.程序如下: #include<stdio.h> void pt(int * pta,

  • C/C++中指针和引用之相关问题深入研究

    一.基本知识指针和引用的声明方式:声明指针: char* pc;声明引用: char c = 'A'   char& rc = c; 它们的区别:①从现象上看,指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变.这句话可以理解为:指针可以被重新赋值以指向另一个不同的对象.但是引用则总是指向在初始化时被指定的对象,以后不能改变,但是指定的对象其内容可以改变. ②从内存分配上看,程序为指针变量分配内存区域,而不为引用分配内存区域,因为引用声明时必须初始化,从而指向一个已经存在的对

  • 详解C++中指针和引用的区别

    1.指针和引用的本质(是什么) (1)指针是存放内存地址的一种变量,特殊的地方就在它存放的是内存地址.因此,指针的大小不会像其他变量一样变化,只跟当前平台相关--不同平台内存地址的范围是不一样的,32位平台下,内存最大为4GB,因此只需要32bit就可以存下,所以sizeof(pointer)的大小是4字节.64位平台下,32位就不够用了,要想内存地址能够都一一表示,就需要64bit(但是目前应该没有这么大的内存吧?),因此sizeof(pointer)是8. (2)引用的本质是"变量的别名&q

  • 实例详解C++中指针与引用的区别

    目录 前言 1.指针的声明 2.使用new来分配内存 3.malloc 与 new 的区别 4.引用的声明与本质 总结 前言 在计算机存储数据时必须要知道三个基本要素:信息存储在何处?存储的值为多少?存储的值是什么类型?因此指针是表示信息在内存中存储地址的一类特殊变量,指针和其所指向的变量就像是一个硬币的两面.指针一直都是学习C语言的难点,在C++中又多了一个引用的概念.初学时很容易把这两个概念弄混,下面就来通过一些例子来说明二者之间的差别. 1.指针的声明 上文中提到,指针和其所指向的变量就像

  • C++中指针的引用*&的具体使用

    指针和引用形式上很好区别,但是他们似乎有相同的功能,都能够直接引用对象,对其进行直接的操作. 首先,引用不可以为空,但指针可以为空.前面也说过了引用是对象的别名,引用为空--对象都不存在,怎么可能有别名!故定义一个引用的时候,必须初始化.因此如果你有一个变量是用于指向另一个对象,但是它可能为空,这时你应该使用指针:如果变量总是指向一个对象,i.e.,你的设计不允许变量为空,这时你应该使用引用. 如指针一样,指针的引用容易使人困惑. 我们注意到类似下面这种语法 void func(int *&x)

  • C++中指针和引用的区别详解

    C++中指针和引用的区别 指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 1.指针和引用的定义和性质区别: (1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元:而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已.如: int a=1;int *p=&a; int a=1;int &b=a; 上面定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单元的

  • 简单谈谈C++中指针与引用的区别

    指针与引用是C++中两个很重要的概念,它们功能看过去很相似,就是都是间接引用某个对象,那么我们应该在什么时候使用指针,什么时候使用引用呢,下面请允许我慢慢道来: 1.永远不要使用一个指向空值的引用.一个引用必须始终指向某个对象,所以当你确定使用一个变量指向某个对象时,但是这个对象在某些时间可能指向控制,这时候你就必须把变量声明为指针类型,而不是引用!当你确定这个变量始终指向某个对象是,这时候你就可以把变量声明为引用类型. char *str=0; //设置指针为空值 char &s=*str;

  • C++指针与引用的区别案例详解

    C++中指针和引用的区别 从概念上讲.指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量). 在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的: 指针传递参数本质上是值传递的方式,它所传递的是一个

随机推荐