带有示例的 C++ 指针
什么是指针?
在 C++ 中,指针指的是保存另一个变量地址的变量。与常规变量一样,指针也具有数据类型。例如,整数类型的指针可以保存整数类型变量的地址。字符类型的指针可以保存字符类型变量的地址。
您应该将指针视为内存地址的符号表示。使用指针,程序可以模拟引用调用。他们还可以创建和操作动态数据结构。在C++中,指针变量是指一个变量指向另一个变量指向的内存中的特定地址。
在本 C++ 教程中,您将学习:
- 什么是指针?
- C++ 中的地址
- 指针声明语法
- 引用运算符 (&) 和引用运算符 (*)
- 指针和数组
- 空指针
- 变量指针
- 指针的应用
- 使用指针的优点
C++ 中的地址
要了解 C++ 指针,您必须了解计算机如何存储数据。
当您在 C++ 程序中创建变量时,会为其分配一些计算机内存空间。此变量的值存储在分配的位置。
为了知道数据在计算机内存中的存储位置,C++ 提供了 & (参考)运算符。运算符返回变量占用的地址。
例如,如果 x 是变量,则 &x 返回变量的地址。
指针声明语法
C++ 的声明采用以下语法:
datatype *variable_name;
- 数据类型是指针的基本类型,必须是有效的 C++ 数据类型。
- variable_name 应该是指针变量的名称。
- 上面用于指针声明的星号类似于用于执行乘法运算的星号。星号将变量标记为指针。
以下是 C++ 中有效指针声明的示例:
int *x; // a pointer to integer double *x; // a pointer to double float *x; // a pointer to float char *ch // a pointer to a character
引用运算符 (&) 和引用运算符 (*)
引用运算符 (&) 返回变量的地址。
解引用运算符 (*) 帮助我们获取已存储在内存地址中的值。
例如:
如果我们有一个给定名称 num 的变量,存储在地址 0x234 并存储值 28。
引用运算符 (&) 将返回 0x234。
解引用运算符 (*) 将返回 5。
示例 1:
#include <iostream> using namespace std; int main() { int x = 27; int *ip; ip = &x; cout << "Value of x is : "; cout << x << endl; cout << "Value of ip is : "; cout << ip<< endl; cout << "Value of *ip is : "; cout << *ip << endl; return 0; }
输出:
这是如何工作的:
下面是代码截图:
代码说明:
- 导入 iostream 头文件。这将允许我们使用头文件中定义的函数而不会出错。
- 包含 std 命名空间以使用其类而不调用它。
- 调用 main() 函数。程序逻辑应添加到此函数的主体中。 { 标记函数体的开始。
- 声明一个整数变量 x 并为其赋值 27。
- 声明一个指针变量*ip。
- 将变量x的地址存储在指针变量中。
- 在控制台上打印一些文本。
- 在屏幕上打印变量 x 的值。
- 在控制台上打印一些文本。
- 打印变量x的地址。地址的值存储在变量 ip 中。
- 在控制台上打印一些文本。
- 打印存储在指针地址处的值。
- 程序应在成功执行后返回值。
- main() 函数体的结尾。
指针和数组
数组和指针基于相关概念工作。使用具有指针的数组时需要注意不同的事项。数组名本身表示数组的基地址。这意味着要将数组的地址分配给指针,您不应使用与号 (&)。
例如:
p = arr;
以上是正确的,因为 arr 表示数组的地址。这是另一个例子:
p = &arr;
以上说法不正确。
我们可以将数组隐式转换为指针。例如:
int arr [20]; int * ip;
下面是一个有效的操作:
ip = arr;
在上述声明之后,ip 和 arr 将是等价的,它们将共享属性。但是,可以为 ip 分配不同的地址,但我们不能为 arr 分配任何内容。
示例 2:
这个例子展示了如何使用指针遍历一个数组:
#include <iostream> using namespace std; int main() { int *ip; int arr[] = { 10, 34, 13, 76, 5, 46 }; ip = arr; for (int x = 0; x < 6; x++) { cout << *ip << endl; ip++; } return 0; }
输出:
下面是代码截图:
代码说明:
- 声明一个整数指针变量ip。
- 声明一个名为 arr 的数组并在其中存储 6 个整数。
- 将 arr 分配给 ip。 ip 和 arr 将变得等价。
- 创建一个 for 循环。创建循环变量 x 是为了迭代从索引 0 到 5 的数组元素。
- 打印存储在指针IP地址处的值。每次迭代会返回一个值,一共会重复 6 次。 endl 是一个 C++ 关键字,表示结束行。此操作允许您在打印每个值后将光标移动到下一行。每个值都将打印在单独的行中。
- 每次迭代后将指针移动到下一个 int 位置。
- for 循环结束。
- 程序必须在成功执行后返回一些东西。
- main() 函数体结束。
空指针
如果没有要分配的确切地址,则可以为指针变量分配 NULL。它应该在声明期间完成。这样的指针称为空指针。它的值为零,并且在许多标准库(如 iostream)中都有定义。
示例 3:
#include <iostream> using namespace std; int main() { int *ip = NULL; cout << "Value of ip is: " << ip; return 0; }
输出:
下面是代码截图:
代码说明:
- 声明一个指针变量ip并将其赋值为NULL。
- 在控制台上打印指针变量 ip 的值以及一些文本。
- 程序必须在成功完成后返回值。
- main() 函数体的结尾。
变量指针
使用 C++,您可以直接从计算机内存中操作数据。
可以根据需要分配或重新分配存储空间。这可以通过指针变量实现。
指针变量指向另一个变量指向的计算机内存中的特定地址。
可以这样声明:
int *p;
或者,
int* p;
在你的例子中,我们已经声明了指针变量 p。
它将保存一个内存地址。
星号是解引用运算符,表示指向的指针。
指针 p 指向内存地址中的一个整数值。
示例 4:
#include <iostream> using namespace std; int main() { int *p, x = 30; p = &x; cout << "Value of x is: " << *p; return 0; }
输出:
下面是代码截图:
代码说明:
- 声明一个指针变量p和一个值为30的变量x。
- 将变量x的地址赋值给p。
- 在控制台上打印指针变量 p 的值以及一些文本。
- 程序必须在成功完成后返回值。
- main() 函数体的结尾。
指针的应用
C++ 中的函数只能返回一个值。此外,函数中声明的所有变量都分配在函数调用堆栈上。一旦函数返回,所有堆栈变量都被销毁。
函数的参数是按值传递的,对变量进行的任何修改都不会改变传递的实际变量的值。下面的例子有助于说明这个概念:-
例5:
#include <iostream> using namespace std; void test(int*, int*); int main() { int a = 5, b = 5; cout << "Before changing:" << endl; cout << "a = " << a << endl; cout << "b = " << b << endl; test(&a, &b); cout << "\nAfter changing" << endl; cout << "a = " << a << endl; cout << "b = " << b << endl; return 0; } void test(int* n1, int* n2) { *n1 = 10; *n2 = 11; }
输出:
下面是代码截图:
代码说明:
- 创建一个名为 test 的函数原型,该函数将采用两个整数参数。
- 调用 main() 函数。我们将在其主体中添加程序逻辑。
- 声明两个整数变量a和b,每个变量的值都是5。
- 在控制台上打印一些文本。 endl(结束行)将移动光标以在下一行开始打印。
- 在控制台上打印变量 a 的值以及其他文本。 endl(结束行)将移动光标以在下一行开始打印。
- 在控制台上打印变量 b 的值以及其他文本。 endl(结束行)将移动光标以在下一行开始打印。
- 创建一个名为 test() 的函数,它将变量 a 和 b 的地址作为参数。
- 在控制台上打印一些文本。 \n 将在打印文本之前创建一个新的空白行。 endl(结束行)将移动光标以在文本打印后的下一行开始打印。
- 在控制台上打印变量 a 的值以及其他文本。 endl(结束行)将移动光标以在下一行开始打印。
- 在控制台上打印变量 b 的值以及其他文本。 endl(结束行)将移动光标以在下一行开始打印。
- 程序必须在成功完成后返回值。
- main() 函数体的结尾。
- 定义函数test()。该函数应采用两个整数指针变量 *n1 和 *n2。
- 将指针变量 *n1 赋值为 10。
- 将指针变量 *n2 赋值为 11。
- 函数 test() 的主体结束。
即使在函数 test 内部为变量 a 和 b 分配了新值,但一旦函数调用完成,外部函数 main 也不会反映出来。
使用指针作为函数参数有助于在函数中传递变量的实际地址,并且对变量执行的所有更改都将反映在外部函数中。
在上述情况下,函数“test”具有变量“a”和“b”的地址。这两个变量可以直接从函数“test”访问,因此对这些变量所做的任何更改都会反映在调用函数中'主要'。
使用指针的优点
这里,是使用指针的优点/好处
- 指针是存储 C++ 中其他变量地址的变量。
- 函数可以使用指针修改和返回多个变量。
- 可以使用指针动态分配和释放内存。
- 指针有助于简化程序的复杂性。
- 使用指针可以提高程序的执行速度。
总结:
- 指针是指一个变量,它保存着另一个变量的地址。
- 每个指针都有一个有效的数据类型。
- 指针是内存地址的符号表示。
- 指针允许程序模拟引用调用以及创建和操作动态数据结构。
- 数组和指针使用一个相关的概念。
- 数组名表示数组的基数。
- 如果要将数组的地址分配给指针,请不要使用与号 (&)。
- 如果没有特定的地址来分配指针变量,则将其分配为 NULL。
C语言