我刚从大学毕业,现在已经在C++工作了一段时间.我理解C++的所有基础知识并使用它们,但我很难掌握指针和类等更高级的主题.我已经阅读了一些书籍和教程,我理解其中的例子,但是当我看到一些高级的现实生活中的例子时,我无法弄明白.这让我很伤心,因为我觉得它让我无法将我的C++编程提升到一个新的水平.有没有人有这个问题?如果是这样,你是如何突破它的?有没有人知道任何真正描述指针和类概念的书籍或教程?或者使用高级指针和类技术的一些示例代码具有良好的描述性注释?任何帮助将不胜感激.
理解C/C++中的指针
在能够理解指针如何工作之前,有必要了解如何在程序中存储和访问变量.每个变量都有2个部分 - (1)存储数据的存储器地址和(2)存储数据的值.
存储器地址通常称为变量的左值,存储的数据值称为rvalue(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的rvalue.因此,我们告诉编译器xptr"指向"x.
假设xptr被分配给1002的内存地址,那么程序的内存可能如下所示:
Variable lvalue rvalue -------------------------------------------- x 1001 10 xptr 1002 1001
下一个难题是"间接运算符"('*'),其使用方法如下:
int y = *xptr;
间接运算符告诉程序将xptr的rval解释为内存地址而不是数据值.也就是说,程序查找存储在由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++中并不是真正的高级主题.它们非常基础.
对我来说,当我开始用箭头绘制框时,指针会凝固.为int画一个框.而int*现在是一个单独的框,箭头指向int框.
所以:
int foo = 3; // integer int* bar = &foo; // assigns the address of foo to my pointer bar
使用我的指针框(条形图),我可以选择查看框内的地址.(这是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
类完全是另一个主题.有一些关于面向对象设计的书籍,但我不知道对于初学者来说是好的.您可能会对介绍Java书籍感到满意.
此链接有一个视频,用于描述指针如何工作,以及claymation.信息丰富,易于消化.
这个页面有一些关于类的基本信息.