C++中的指针一直是学习的难点,本文将会详细讲述指针的含义以及函数使用指针传参的作用,同时也会介绍函数引用 (Cite) 传参的作用。
指针是C++编程中一个核心的概念,它提供了一种访问和操作内存的方式,使得程序员能够更灵活地处理数据。指针是一种变量,其值是另一个数据的地址。这意味着通过指针,程序可以直接访问和操作存储在特定内存地址的数据。下面给出指针存地址信息的一个案例。
# include <iostream>
int main()
{
int a = 1;
int* ptr = &a;
std::cout << ptr << std::endl;
}
运行上面的代码,我们可以得到ptr这个指针变量的值,是a变量的内存地址。如下:
通过访问指针变量ptr的值,即访问0095F72C这个内存地址存的数值,可以发现,这个内存地址存放的数值实际上是变量a的值。如下:
实际上还可以知道编译器是大端存储的方式,在这里,每一组数据2个数代表一个字节,我们知道,一个字节由8个比特组成,每个十六进制数字表示4个比特,所以cc在这里表示的是两个十六进制数字,即8个比特,也就是一个字节。
好了,回归正题,我们现在知道指针变量ptr的值是变量a的内存地址,那指针变量ptr是如何存储的呢,实际上指针变量ptr也有自己的内存地址,而不是凭空出现,指针的作用只是存放其他变量的内存地址,而指针变量也有自己的内存地址,仅仅而已。
通过略微修改上面的代码,即可以发现 双指针变量ptr_new存放的值是指针变量ptr的内存地址。此处我们会发现ptr的值变化了,实际上不用太注重这个变化,因为重新编译,编译器重新给a分配了内存地址存放数据,所以会引起指针变量ptr的变化。这里小声说一下,实际上第一次和第二次指针变量ptr的存储内存地址也发生了变化,只是第一次我们并没有打印出来ptr的内存地址,所以观察不到两次的变化。
讲完了指针的含义,下面我们会讨论一下指针参数在函数中的应用。
# include <iostream>
void test(int a) {
a++;
}
int main()
{
int a = 1;
test(a);
std::cout << a << std::endl;
}
众所周知,如上图这样子的直接传参形式并不会改变全局变量a的值,因为此种传参方式,实际上会再生成一个局部变量来存储a的数值,实际上无法改变全局变量a对应的地址上的数值,运行结果仍然是1。而此时就需要用指针的方法直接访问a的内存地址,并修改a的数值。如下:
# include <iostream>
void test(int* b) {
(*b)++;
}
int main()
{
int a = 1;
test(&a);
std::cout << a << std::endl;
}
通过传入指针参数,即把a的地址赋给成指针形参b,通过访问变量a的内存地址直接修改数据即可修改a的值,运行发现此时运行结果是2。
实际上在实际应用中,我们会发现这样的内存地址和数据的转换略显繁琐,此时引用(Cite)就出现了,引用实际上就是集成了指针的操作,方便在函数内部对全局变量的处理。如下:
# include <iostream>
void test(int& b) {
b++;
}
int main()
{
int a = 1;
test(a);
std::cout << a << std::endl;
}
此时运行结果依然是2,这就是引用的效果,不仅简化了函数内部对传入参数的处理,在调用函数时也简化了传参操作,简洁明了。此时引用的操作可以认为是 *(&b) 取地址加取值,这样大大提高了代码的简洁性,同时也达到了我们的目的。在实际代码编写过程中,灵活运用指针和引用是必要的。本文关于指针和引用的介绍就到此结束,之后会不定期更新相关内容,谢谢支持。