C++ 带示例的指针

什么是指针?

In 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;
}

输出:

引用运算符 (&) 和引用运算符 (*)

工作原理:

引用运算符 (&) 和引用运算符 (*)

以下是代码截图:

引用运算符 (&) 和引用运算符 (*)

代码说明:

  1. 导入 iostream 头文件。这将允许我们使用头文件中定义的函数而不会出现错误。
  2. 包含 std 命名空间以便使用其类而不调用它。
  3. 调用 main() 函数。程序逻辑应添加在此函数主体内。{ 标记函数主体的开始。
  4. 声明一个整型变量 x 并赋值 27。
  5. 声明一个指针变量*ip。
  6. 将变量x的地址存储在指针变量中。
  7. 在控制台上打印一些文本。
  8. 在屏幕上打印变量 x 的值。
  9. 在控制台上打印一些文本。
  10. 打印变量 x 的地址。该地址的值存储在变量 ip 中。
  11. 在控制台上打印一些文本。
  12. 打印存储在指针地址的值。
  13. 程序执行成功后应该返回值。
  14. 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;
}

输出:

指针和数组

以下是代码截图:

指针和数组

代码说明:

  1. 声明一个整型指针变量ip。
  2. 声明一个名为 arr 的数组,并在其中存储 6 个整数。
  3. 将 arr 赋值给 ip,ip 和 arr 就变得等价了。
  4. 创建一个 for 循环。创建循环变量 x 来迭代从索引 0 到 5 的数组元素。
  5. 打印存储在指针 IP 地址的值。每次迭代将返回一个值,总共进行 6 次重复。endl 是 C++ 表示结束行的关键字。此操作允许您在打印每个值后将光标移动到下一行。每个值都将打印在单独的行中。
  6. 每次迭代后将指针移动到下一个 int 位置。
  7. 循环结束。
  8. 程序成功执行后必须返回一些内容。
  9. main() 函数体结束。

空指针

如果没有要分配的确切地址,则可以为指针变量分配 NULL。这应该在声明期间完成。这样的指针称为空指针。其值为零,并在许多标准库(如 iostream)中定义。

例如3:

#include <iostream>
using namespace std;
int main() {
	int  *ip = NULL;
	cout << "Value of ip is: " << ip;
	return 0;
}

输出:

空指针

以下是代码截图:

空指针

代码说明:

  1. 声明一个指针变量ip并赋予其NULL值。
  2. 在控制台上打印指针变量 ip 的值以及一些文本。
  3. 程序成功完成后必须返回值。
  4. 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;
}

输出:

变量指针

以下是代码截图:

变量指针

代码说明:

  1. 声明一个指针变量 p 和一个变量 x,其值为 30。
  2. 将变量x的地址赋给p。
  3. 在控制台上打印指针变量 p 的值以及一些文本。
  4. 程序成功完成后必须返回值。
  5. 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;
}

输出:

指针的应用

以下是代码截图:

指针的应用

代码说明:

  1. 创建一个名为 test 的函数原型,该函数将接受两个整数参数。
  2. 调用 main() 函数。我们将在其主体内添加程序逻辑。
  3. 声明两个整型变量 a 和 b,每个值均为 5。
  4. 在控制台上打印一些文本。endl(结束行)将移动光标以在下一行开始打印。
  5. 将变量 a 的值与其他文本一起打印在控制台上。endl(结束行)将移动光标以开始打印下一行。
  6. 将变量 b 的值与其他文本一起打印在控制台上。endl(结束行)将移动光标以开始打印下一行。
  7. 创建一个名为 test() 的函数,以变量 a 和 b 的地址作为参数。
  8. 在控制台上打印一些文本。\n 将在打印文本之前创建一个新的空白行。endl(结束行)将在打印文本后将光标移动到下一行开始打印。
  9. 将变量 a 的值与其他文本一起打印在控制台上。endl(结束行)将移动光标以开始打印下一行。
  10. 将变量 b 的值与其他文本一起打印在控制台上。endl(结束行)将移动光标以开始打印下一行。
  11. 程序成功完成后必须返回值。
  12. main() 函数体结束。
  13. 定义函数 test()。该函数应采用两个整型指针变量 *n1 和 *n2。
  14. 将指针变量 *n1 的值赋为 10。
  15. 将指针变量 *n2 的值赋为 11。
  16. 函数 test() 主体结束。

即使在函数测试内部为变量 a 和 b 分配了新值,但函数调用完成后,外部函数 main 中并不会反映相同的值。

使用指针作为函数参数有助于在函数中传递变量的实际地址,并且对变量执行的所有更改都将反映在外部函数中。

在上面的例子中,函数“test”具有变量“a”和“b”的地址。这两个变量可从函数“test”直接访问,因此对这些变量所做的任何更改都会反映在调用函数“main”中。

使用指针的优点

以下是使用指针的优点/好处

  • 指针是存储其他地址的变量 中的变量 C++.
  • 函数可以使用指针修改并返回多个变量。
  • 可以使用指针动态分配和取消分配内存。
  • 指针有助于简化程序的复杂性。
  • 使用指针可以提高程序的执行速度。

总结

  • 指针指向保存另一个变量地址的变量。
  • 每个指针都有一个有效的数据类型。
  • 指针是内存地址的符号表示。
  • 指针允许程序模拟引用调用并创建和操作动态数据结构。
  • 阵列 和指针使用相关的概念。
  • 数组名称表示数组的基数。
  • 如果要将数组的地址分配给指针,请不要使用与符号 (&)。
  • 如果没有特定地址来分配指针变量,则为其分配NULL。

每日Guru99新闻简报

通过立即获取最新、最重要的人工智能新闻报道来开始您的一天。