tim*_*myg 7 c++ pointers class
我刚从大学毕业,现在已经在C++工作了一段时间.我理解C++的所有基础知识并使用它们,但我很难掌握指针和类等更高级的主题.我已经阅读了一些书籍和教程,我理解其中的例子,但是当我看到一些高级的现实生活中的例子时,我无法弄明白.这让我很伤心,因为我觉得它让我无法将我的C++编程提升到一个新的水平.有没有人有这个问题?如果是这样,你是如何突破它的?有没有人知道任何真正描述指针和类概念的书籍或教程?或者使用高级指针和类技术的一些示例代码具有良好的描述性注释?任何帮助将不胜感激.
17 *_* 26 19
理解C/C++中的指针
在能够理解指针如何工作之前,有必要了解如何在程序中存储和访问变量.每个变量都有2个部分 - (1)存储数据的存储器地址和(2)存储数据的值.
存储器地址通常称为变量的左值,存储的数据值称为rvalue(l和r表示左和右).
考虑一下声明:
int x = 10;
Run Code Online (Sandbox Code Playgroud)
在内部,程序将存储器地址与变量x相关联.在这种情况下,假设程序将x指定为驻留在地址1001(不是实际地址,但为简单起见而选择).因此,x的左值(存储器地址)是1001,x的右值(数据值)是10.
只需使用变量"x"即可访问右值.为了访问左值,需要"地址"运算符('&').表达式"&x"被读作"x的地址".
Expression Value
----------------------------------
x 10
&x 1001
Run Code Online (Sandbox Code Playgroud)
存储在x中的值可以随时更改(例如x = 20),但x(&x)的地址永远不会改变.
指针只是一个可用于修改另一个变量的变量.它通过为其右值设置内存地址来实现此目的.也就是说,它指向内存中的另一个位置.
创建指向"x"的指针如下:
int* xptr = &x;
Run Code Online (Sandbox Code Playgroud)
"int*"告诉编译器我们正在创建一个指向整数值的指针."=&x"部分告诉编译器我们将x的地址分配给xptr的rvalue.因此,我们告诉编译器xptr"指向"x.
假设xptr被分配给1002的内存地址,那么程序的内存可能如下所示:
Variable lvalue rvalue
--------------------------------------------
x 1001 10
xptr 1002 1001
Run Code Online (Sandbox Code Playgroud)
下一个难题是"间接运算符"('*'),其使用方法如下:
int y = *xptr;
Run Code Online (Sandbox Code Playgroud)
间接运算符告诉程序将xptr的rval解释为内存地址而不是数据值.也就是说,程序查找存储在由xptr(1001)提供的地址处的数据值(10).
把它们放在一起:
Expression Value
--------------------------------------------
x 10
&x 1001
xptr 1001
&xptr 1002
*xptr 10
Run Code Online (Sandbox Code Playgroud)
既然已经解释了概念,这里有一些代码来演示指针的功能:
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);
Run Code Online (Sandbox Code Playgroud)
对于输出,您会看到(注意:每次内存地址都不同):
x = 10
&x = 3537176
xptr = 3537176
*xptr = 10
x = 20
*xptr = 20
Run Code Online (Sandbox Code Playgroud)
注意如何为'*xptr'赋值,改变了'x'的值.这是因为'*xptr'和'x'指的是内存中的相同位置,如'&x'和'xptr'具有相同的值所示.
nsa*_*ers 18
指针和类在C++中并不是真正的高级主题.它们非常基础.
对我来说,当我开始用箭头绘制框时,指针会凝固.为int画一个框.而int*现在是一个单独的框,箭头指向int框.
所以:
int foo = 3; // integer
int* bar = &foo; // assigns the address of foo to my pointer bar
Run Code Online (Sandbox Code Playgroud)
使用我的指针框(条形图),我可以选择查看框内的地址.(这是foo的内存地址).或者我可以操纵我拥有的任何地址.那种操纵意味着我跟随箭头到整数(foo).
*bar = 5; // asterix means "dereference" (follow the arrow), foo is now 5
bar = 0; // I just changed the address that bar points to
Run Code Online (Sandbox Code Playgroud)
类完全是另一个主题.有一些关于面向对象设计的书籍,但我不知道对于初学者来说是好的.您可能会对介绍Java书籍感到满意.
假设一个指针是一个数组地址。
x = 500; // memory address for hello;
MEMORY[x] = "hello";
print MEMORY[x];
Run Code Online (Sandbox Code Playgroud)
它的图形过于简单化,但在大多数情况下,只要您不想知道该数字是什么或手动设置它就应该没问题。
当我了解 CI 有一些宏时,我有一些宏,它们或多或少允许您使用指针,就像它们是内存中的数组索引一样。但我早已丢失了该代码并且早已忘记。
我记得它开始于
#define MEMORY 0;
#define MEMORYADDRESS( a ) *a;
Run Code Online (Sandbox Code Playgroud)
而它本身几乎没有什么用处。希望其他人可以扩展这个逻辑。