C++ 指针

C++ 语言中的指针是一种变量,它也被称为定位器或指示器,用于指向一个值的地址。

指针的符号表示地址。除了创建和修改动态数据结构外,它们还允许程序模拟按引用传递。指针的一个主要应用是遍历数组或其他数据结构的组件。指针变量引用与你处理的变量相同的数据类型,并将该变量的地址设置为它的值(如 int 或 string)。

语法

数据类型 *变量名; 
int *ptr; // ptr 可以指向一个保存 int 数据的地址 

如何使用指针?

  1. 声明指针变量。
  2. 使用一元运算符 (&) 可以获取变量的地址,将指针赋值为变量的地址。
  3. 使用一元运算符 (*) 可以访问提供的地址中变量的值。

由于数据类型知道信息保存在多少字节中,所以我们在递增指针时加上它所指向的数据类型的大小。

1.png

指针的优点

  1. 指针减少了代码并提高了性能,它用于检索字符串、树等,并与数组、结构和函数一起使用。
  2. 我们可以使用指针从函数中返回多个值。
  3. 它使您能够访问计算机内存中的任何内存位置。

指针的用途

C++ 语言中有许多使用指针的用途。

  1. 动态内存分配

在 C 语言中,我们可以使用 malloc() 和 calloc() 函数动态分配内存,其中使用了指针。

  1. 数组、函数和结构

C 语言中的指针广泛用于数组、函数和结构。它减少了代码并提高了性能。

指针中使用的符号

符号名称描述
&(取地址运算符)地址运算符确定变量的地址
*(间接运算符)间接运算符访问给定参数所提供地址的变量的值

声明指针

C++ 语言中的指针可以使用 *(星号符号)声明。

int *a; // 指向 int 的指针 
char *c; // 指向 char 的指针 

指针示例

下面是一个简单的使用指针打印地址和值的示例。

#include <iostream>
using namespace std;

int main()
{
    int number = 30;
    int *p;
    p = &number; // 存储 number 变量的地址
    cout << "Address of number variable is: " << &number << endl;
    cout << "Address of p variable is: " << p << endl;
    cout << "Value of p variable is: " << *p << endl;

    return 0;
}

输出:

Address of number variable is: 0x7ffccc8724c4 Address of p variable is: 0x7ffccc8724c4 Value of p variable is: 30

使用指针交换两个数(不使用第三个变量)

#include <iostream>
using namespace std;

int main()
{
    int a = 20, b = 10, *p1 = &a, *p2 = &b;
    cout << "Before swap: *p1=" << *p1 << " *p2=" << *p2 << endl;
    *p1 = *p1 + *p2;
    *p2 = *p1 - *p2;
    *p1 = *p1 - *p2;
    cout << "After swap: *p1=" << *p1 << " *p2=" << *p2 << endl;

    return 0;
}

输出:

Before swap: *p1=20 *p2=10 
After swap: *p1=10 *p2=20

什么是指针和字符串字面量?

字符串字面量是以空字符结尾的字符序列数组。字符串字面量的元素是类型为 const char 的数组(因为字符串中的字符不能修改),加上一个终止的空字符。

什么是空指针(void pointer)?

空指针是C++语言中一种特殊的指针类型,它代表了缺乏具体类型的指针。指向没有具体类型的值的指针被称为空指针(void pointer),因此它们具有未确定的长度和未确定的解引用属性。这意味着空指针非常灵活,因为它们可以指向任何数据类型。这种灵活性具有优势。空指针无法直接进行解引用操作。在对空指针进行解引用之前,必须将其转换为指向特定数据类型的其他指针类型。

什么是无效指针?

指针必须指向一个有效的地址,但不一定指向有用的内容(比如数组)。我们将这些指针称为无效指针。此外,未初始化的指针也属于无效指针。

int *ptr1;
int arr[10];
int *ptr2 = arr+20;

在上面的代码中,ptr1没有被初始化,因此是无效的指针。而ptr2超出了arr的边界,也是无效的指针(请注意,并非所有构建错误都是由错误的引用导致的)。

什么是空指针(null pointer)?

空指针不仅仅是一个错误的地址;它也指向空(nowhere)。下面是两种将指针标记为空的方法:

int *ptr1 = 0;
int *ptr2 = NULL;

什么是指向指针的指针?

在 C++ 中,我们有能力创建指向另一个指针的指针,它可以指向数据或另一个指针。在每个间接级别的指针声明语法中,只需要一元运算符 (*)。

char a;
char *b;
char **c;
a = 'g';
b = &a;
c = &b;

这里,b 指向存储了 'g' 的 char,c 指向指针 b。

引用和指针有什么区别?

  1. 值传递
  2. 通过指针参数进行引用传递
  3. 通过引用参数进行引用传递

示例:

#include <iostream>
using namespace std;

// 值传递
int square1(int n)
{
    cout << "n1的地址(在square1()内): " << &n << "\n";
    n *= n;
    return n;
}

// 指针传递
void square2(int* n)
{
    cout << "n2的地址(在square2()内): " << n << "\n";
    *n *= *n;
}

// 引用传递
void square3(int& n)
{
    cout << "n3的地址(在square3()内): " << &n << "\n";
    n *= n;
}

void example()
{
    // 值传递
    int n1 = 8;
    cout << "n1的地址(在main()内): " << &n1 << "\n";
    cout << "n1的平方: " << square1(n1) << "\n";
    cout << "n1的值未改变: " << n1 << "\n";

    // 指针传递
    int n2 = 8;
    cout << "n2的地址(在main()内): " << &n2 << "\n";
    square2(&n2);
    cout << "n2的平方: " << n2 << "\n";
    cout << "n2的值发生了改变: " << n2 << "\n";

    // 引用传递
    int n3 = 8;
    cout << "n3的地址(在main()内): " << &n3 << "\n";
    square3(n3);
    cout << "n3的平方: " << n3 << "\n";
    cout << "n3的值发生了改变: " << n3 << "\n";
}

int main()
{
    example();
    return 0;
}

输出

2.png

标签: C++语言, C++语言教程, C++语言技术, C++语言学习, C++语言学习教程, C++语言下载, C++语言开发, C++语言入门教程, C++语言进阶教程, C++语言高级教程, C++语言面试题, C++语言笔试题, C++语言编程思想