C++ C++;指针和参考说明

C++ C++;指针和参考说明,c++,pointers,C++,Pointers,这基本上只是为了帮助我更好地理解指针,所以如果你们能确认/否认/解释任何我看不懂的东西,我将不胜感激。使用邮箱、阿姨、街道以及所有这些垃圾的例子令人困惑 int a = 5; int b = &a; // b will be the memory address of 'a' int *c = a; // c will be the value of 'a' which is 5 int *d = &a; // d will be a pointer to the memo

这基本上只是为了帮助我更好地理解指针,所以如果你们能确认/否认/解释任何我看不懂的东西,我将不胜感激。使用邮箱、阿姨、街道以及所有这些垃圾的例子令人困惑

int a = 5;

int b = &a; // b will be the memory address of 'a'

int *c = a; // c will be the value of 'a' which is 5

int *d = &a; // d will be a pointer to the memory address of 'a'

int &e = a; // what would this be?


void FunctionA()
{
     int a = 20;
     FunctionB(&a);
     // a is now 15?
}

void FunctionB(int *a)
{
     a = 15;
}
谢谢你们的帮助,我只是想提高我的理解力,超越我阅读的所有蹩脚的隐喻解释

int &e = a; // what would this be?
e
是对
a
的引用。在这种情况下,与符号不是操作员的“地址”。您将
e
视为一个普通(不是指针)变量,但是
e
a
的值将是相同的,无论您对其中一个变量做什么(只要两者都在范围内),因为本质上
e
只是一个别名

e
是对
a
的引用。在这种情况下,与符号不是操作员的“地址”。您将
e
视为一个普通(不是指针)变量,但是
e
a
的值将是相同的,无论您对其中一个做什么(只要两者都在范围内),因为本质上
e
只是一个别名。

我想您的意思是:

int*b=&a,它使一个名为b的指针指向a的值(b是一个指针,它是a的地址)

intc=*b,(如果您只希望c有a的值,则只需int c=a)在本例中,*取消对指针b的引用

function()
如下所示,那么
a
将是15(您正在将
a
的地址传递给FunctionB)

void FunctionB(int*a){*a=15;}
将值设置为15(*取消引用)

我想您的意思是:

int*b=&a,它使一个名为b的指针指向a的值(b是一个指针,它是a的地址)

intc=*b,(如果您只希望c有a的值,则只需int c=a)在本例中,*取消对指针b的引用

function()
如下所示,那么
a
将是15(您正在将
a
的地址传递给FunctionB)


void FunctionB(int*a){*a=15;}
将值设置为15(*解除引用)

int&e=a是对“a”的引用

这些是错误:


int b = &a;
int *c = a;

int&e=a是对“a”的引用

这些是错误:


int b = &a;
int *c = a;
INTA=5

到目前为止还不错

int b=&a;//b将是“a”的内存地址

这实际上是一个编译错误。你的意思可能是
int*b=&a
b
是指向整数的指针。 编辑:如果要以数字形式获取地址,则需要强制转换为整数:
intb=(int)&a

int*c=a;//c将是“a”的值,即5

这个更让人困惑。当然,指针的核心只是一个数字,但这种赋值本质上是不安全的(正如您所看到的,您将5赋值给指针,并试图取消引用,这很可能会使程序崩溃)。如果确实希望
c
指向内存位置5,则必须明确地告诉编译器您知道自己在做什么:
int*c=(int*)a

int*d=&a;//d将是指向“a”的内存地址的指针

这一个是对的,和你所说的第二个一样

int&e=a;//这是什么

e
是对
a
的“参考”。基本上,它在内部只是一个指向
a
的指针,但您不必手动取消引用它,编译器会为您处理它

void function(){int a=20;FunctionB(&a);//a现在是15?}

无效函数b(int*a){a=15;}

…假设您将其写成
*a=15。您正在覆盖由
a
指向的值,而不是指针本身

总的来说,你似乎很困惑,我建议你读一读《用C++思考》,这本书写得很好

INTA=5

到目前为止还不错

int b=&a;//b将是“a”的内存地址

这实际上是一个编译错误。你的意思可能是
int*b=&a
b
是指向整数的指针。 编辑:如果要以数字形式获取地址,则需要强制转换为整数:
intb=(int)&a

int*c=a;//c将是“a”的值,即5

这个更让人困惑。当然,指针的核心只是一个数字,但这种赋值本质上是不安全的(正如您所看到的,您将5赋值给指针,并试图取消引用,这很可能会使程序崩溃)。如果确实希望
c
指向内存位置5,则必须明确地告诉编译器您知道自己在做什么:
int*c=(int*)a

int*d=&a;//d将是指向“a”的内存地址的指针

这一个是对的,和你所说的第二个一样

int&e=a;//这是什么

e
是对
a
的“参考”。基本上,它在内部只是一个指向
a
的指针,但您不必手动取消引用它,编译器会为您处理它

void function(){int a=20;FunctionB(&a);//a现在是15?}

无效函数b(int*a){a=15;}

…假设您将其写成
*a=15。您正在覆盖由
a
指向的值,而不是指针本身


总的来说,你似乎很困惑,我建议你读一读《用C++思考》,这本书写得很好

我会一件一件地拿:

int b = &a; // b will be the memory address of 'a'
不。编译器(可能)不允许这样做。您已将
b
定义为
int
,但
&a
int
的地址,因此初始化将不起作用

int *c = a;
不,是同一个问题,但正好相反。您已将
c
定义为
int &e = a;
void FunctionA() { int a = 20; FunctionB(&a); }
void FunctionB(int *a) { a = 15; }
void FunctionB(int *a) { *a = 15; }
+---+---+---+---+---+-- | | | | | | ... +---+---+---+---+---+-- 100 101 102 103 104 ...
int  a = 5;
int *b = &a;
a b +---+---+---+---+---+-- | 5 | |100| | | ... +---+---+---+---+---+-- 100 101 102 103 104 ...
int a = 5;
char b = 2;
a a a a b +---+---+---+---+---+-- | 0 | 0 | 0 | 5 | 2 | ... +---+---+---+---+---+-- 100 101 102 103 104 ...