📜  C++ 中的指针(1)

📅  最后修改于: 2023-12-03 15:13:58.795000             🧑  作者: Mango

C++ 中的指针

指针是C++中的一种重要数据类型,它是一种变量,存储着另一个变量的地址。使用指针可以很方便地访问和操作内存中的数据。在本文中,我们将深入介绍指针的各种用法和注意事项。

定义和赋值指针

在C++中,定义一个指针需要在变量名前加上星号 (*),例如:

int* ptr;

这里定义了一个指向int类型数据的指针。在定义指针时,我们并没有为它分配内存空间,因此它现在是一个野指针,在使用前必须给它赋值。

为一个指针赋值的方式有两种,一种是将变量的地址赋值给指针,另一种是使用new运算符动态分配内存并返回指针。例如:

int a = 10;
ptr = &a; // 将a的地址赋值给ptr

int* ptr2 = new int; // 动态分配一个int类型的内存空间
*ptr2 = 20; // 将20赋值给动态分配的内存

在使用完指针后,我们需要使用delete运算符释放动态分配的内存,例如:

delete ptr2; // 释放动态分配的内存
操作指针

我们可以使用指针来访问和修改指向的变量的值,例如:

int a = 10;
int* ptr = &a;
*ptr = 20;
std::cout << a; // 输出20

指针还可以进行加减法运算,例如:

int a[5] = {1, 2, 3, 4, 5};
int* ptr = a;
std::cout << *(ptr + 2); // 输出3

在上面的例子中,指针ptr指向数组a的第一个元素,*(ptr + 2)表示指针向后移动2个元素,即指向a[2]。

我们还可以使用指针的比较运算符,例如:

int a = 10;
int* ptr1 = &a;
int* ptr2 = &a;
std::cout << (ptr1 == ptr2); // 输出1,表示两个指针指向同一地址
指针和数组

在C++中,数组名本身就是指向数组第一个元素的指针,例如:

int a[5] = {1, 2, 3, 4, 5};
int* ptr = a;
std::cout << *ptr; // 输出1,与a[0]相同

我们还可以将指针用作数组下标,例如:

int a[5] = {1, 2, 3, 4, 5};
int* ptr = a;
for (int i = 0; i < 5; i++) {
    std::cout << *(ptr + i); // 依次输出a[0]到a[4]的值
}
用指针作为函数参数

指针经常被用作函数参数,这样函数就可以改变指针所指向的变量的值。例如:

void swap(int* a, int* b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int a = 10, b = 20;
    swap(&a, &b); // 将a和b的值交换
    std::cout << a << " " << b; // 输出20 10
    return 0;
}

在上面的例子中,swap函数接受两个指针作为参数,它们分别指向a和b。函数内部用一个临时变量temp保存a的值,然后将a赋值为b的值,将b赋值为temp的值,从而实现了a和b的交换。

指针和引用的比较

指针和引用都可以用来访问内存中的数据,但它们之间有着很大的区别。

指针可以被重新赋值,也可以为空(null),而引用一旦被初始化就不能再改变,也不能为null。

指针可以指向一个对象或数组中的任意元素,而引用必须指向已经存在的对象。

指针需要使用*运算符来访问指向的对象或数组元素,而引用本身就是一个别名,不需要使用任何运算符。

结论

指针是C++中的一种重要数据类型,可以很方便地访问和操作内存中的数据。熟练地使用指针可以让我们写出更加高效和灵活的程序,但同时也需要注意指针的各种注意事项,例如指针和引用的比较、野指针的问题等等。