C++教程-C++指针
C++ 指针
C++ 语言中的指针是一种变量,它也被称为定位器或指示器,用于指向一个值的地址。
指针的符号表示地址。除了创建和修改动态数据结构外,它们还允许程序模拟按引用传递。指针的一个主要应用是遍历数组或其他数据结构的组件。指针变量引用与你处理的变量相同的数据类型,并将该变量的地址设置为它的值(如 int 或 string)。
语法
数据类型 *变量名;
int *ptr; // ptr 可以指向一个保存 int 数据的地址
如何使用指针?
- 声明指针变量。
- 使用一元运算符 (&) 可以获取变量的地址,将指针赋值为变量的地址。
- 使用一元运算符 (*) 可以访问提供的地址中变量的值。
由于数据类型知道信息保存在多少字节中,所以我们在递增指针时加上它所指向的数据类型的大小。
指针的优点
- 指针减少了代码并提高了性能,它用于检索字符串、树等,并与数组、结构和函数一起使用。
- 我们可以使用指针从函数中返回多个值。
- 它使您能够访问计算机内存中的任何内存位置。
指针的用途
C++ 语言中有许多使用指针的用途。
- 动态内存分配
在 C 语言中,我们可以使用 malloc() 和 calloc() 函数动态分配内存,其中使用了指针。
- 数组、函数和结构
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。
引用和指针有什么区别?
- 值传递
- 通过指针参数进行引用传递
- 通过引用参数进行引用传递
示例:
#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;
}
输出