c++ - 在 C++ 中,我无法掌握指针和类

标签 c++ class pointers

我刚从大学毕业,现在已经使用 C++ 工作了一段时间。我了解 C++ 的所有基础知识并使用它们,但我很难掌握更高级的主题,如指针和类。我已经阅读了一些书籍和教程,并且理解其中的示例,但是当我查看一些现实生活中的高级示例时,我无法理解它们。这让我很难受,因为我觉得它让我无法将我的 C++ 编程提升到一个新的水平。其他人有这个问题吗?如果有,你是如何突破的? 有谁知道真正很好地描述指针和类概念的任何书籍或教程? 或者也许一些示例代码使用高级指针和类技术进行了很好的描述性注释? 任何帮助将不胜感激。

最佳答案

理解 C/C++ 中的指针

在理解指针的工作原理之前,有必要了解变量在程序中的存储和访问方式。每个变量都有两部分 - (1) 存储数据的内存地址和 (2) 存储数据的值。

内存地址通常被称为变量的左值,而存储数据的值被称为右值(l 和 r 表示左和右)。

考虑语句:

int x = 10;

在内部,程序将内存地址与变量 x 相关联。在这种情况下,我们假设程序将 x 分配到地址 1001(不是实际地址,但为简单起见而选择)。因此,x的左值(内存地址)为1001,x的右值(数据值)为10。

只需使用变量“x”即可访问右值。为了访问左值,需要“地址”运算符(‘&’)。表达式“&x”被读作“x 的地址”。

Expression          Value
----------------------------------
x                   10
&x                  1001

存储在 x 中的值可以随时更改(例如 x = 20),但 x (&x) 的地址永远不能更改。

指针只是一个变量,可以用来修改另一个变量。它通过为其右值设置一个内存地址来实现这一点。也就是说,它指向内存中的另一个位置。

创建一个指向“x”的指针是这样完成的:

int* xptr = &x;

“int*”告诉编译器我们正在创建一个指向整数值的指针。 “= &x”部分告诉编译器我们正在将 x 的地址分配给 xptr 的右值。因此,我们告诉编译器 xptr“指向”x。

假设xptr被分配到1002的内存地址,那么程序的内存可能是这样的:

Variable    lvalue    rvalue
--------------------------------------------
x           1001      10   
xptr        1002      1001

下一 block 拼图是“间接运算符”(‘*’),其用法如下:

int y = *xptr;

间接运算符告诉程序将 xptr 的右值解释为内存地址而不是数据值。也就是说,程序查找存储在 xptr (1001) 提供的地址中的数据值 (10)。

综合起来:

Expression      Value
--------------------------------------------
x                   10
&x                  1001
xptr                1001
&xptr               1002
*xptr               10

既然已经解释了这些概念,下面是一些代码来展示指针的强大功能:

int x = 10;
int *xptr = &x;

printf("x = %d\n", x);
printf("&x = %d\n", &x);        
printf("xptr = %d\n", xptr);
printf("*xptr = %d\n", *xptr);

*xptr = 20;

printf("x = %d\n", x);
printf("*xptr = %d\n", *xptr);

对于输出你会看到(注意:内存地址每次都会不同):

x = 10
&x = 3537176
xptr = 3537176
*xptr = 10
x = 20
*xptr = 20

注意为“*xptr”赋值是如何改变“x”的值的。这是因为‘*xptr’和‘x’指的是内存中的相同位置,‘&x’和‘xptr’具有相同的值就证明了这一点。

关于c++ - 在 C++ 中,我无法掌握指针和类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/96285/

相关文章:

ios - 在 iOS 上使用 ARC 进行内存管理

c++ - WinDbg 不显示某些小型转储文件的完整堆栈跟踪

c++ - 有时会显示透明颜色

c++ - 尝试重写 jmp 时出现访问冲突异常

java - 为什么我不能在内部类中声明和初始化静态变量?

delphi - 读取任意内存位置?可能的?

C++ Alt-Tab 钩子(Hook)

C# 抽象类 : Cannot implicitly convert type type1 to type2

html - 类没有被赋予它的属性。限制?(html + css)

c - 如何从函数返回字符数组?然后在另一个函数中使用返回的字符?