C++ 指针
C++语言中的指针是一种变量,它也被称为定位器或指示器,用于指向一个值的地址。
地址的符号由指针表示。除了创建和修改动态数据结构外,它们还允许程序模拟按引用调用。指针的主要应用之一是遍历数组或其他数据结构的组件。指针变量引用与您处理的变量相同的数据类型,并将该变量的地址设置为它(例如int或string)。
语法
datatype *var_name;
int *ptr; // ptr can point to an address which holds int data
如何使用指针
- 创建一个指针变量。
- 使用一元运算符(&)获取变量的地址,将指针赋值为变量的地址。
- 使用一元运算符(*),通过提供的地址参数获取变量存储的值。
由于数据类型知道信息占用多少字节,我们将其与引用关联起来。当我们增加一个指针时,会加上指向的数据类型的大小。
指针的优点
1) 指针减少了代码量并提高了性能,它用于检索字符串、树等,并与数组、结构体和函数一起使用。
2) 我们可以使用指针从函数中返回多个值。
3) 它使您能够访问计算机内存中的任何内存位置。
指针的用法
在C++语言中有许多用途可以使用指针。
1) 动态内存分配
在c语言中,我们可以使用malloc()和calloc()函数动态分配内存,其中使用指针。
2) 数组、函数和结构体
c语言中的指针广泛用于数组、函数和结构体中。它减少了代码量并提高了性能。
指针中使用的符号
符号 | 名称 | 描述 |
---|---|---|
&(和号) | 地址运算符 | 确定变量的地址。 |
∗(星号) | 间接运算符 | 访问地址的值。 |
声明指针
在C++语言中,可以使用∗(星号符号)来声明指针。
int ∗ a; //pointer to int
char ∗ c; //pointer to char
指针示例
让我们看一个简单的示例,使用指针打印地址和值。
#include <iostream>
using namespace std;
int main()
{
int number=30;
int ∗ p;
p=&number//stores the address of number variable
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
指针程序,不使用第三个变量交换2个数字
#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类型的数组(因为字符串中的字符不能被修改),再加上一个终止的空字符。
什么是空指针
空指针是C++中的一种特殊类型的指针,它代表了某种类型的缺失。指向没有类型的值的指针被称为空指针(因此也具有未确定的长度和未确定的解引用属性)。这意味着空指针非常灵活,因为它们可以指向任何数据类型。这种灵活性有好处。这些指针不能直接解引用。在它们可以被解引用之前,它们必须转换成指向特定数据类型的另一种指针类型。
什么是无效指针
指针必须指向一个有效的地址,不一定是有用的项目(比如数组)。我们把这些指针称为无效指针。此外,无效指针也是未初始化的指针。
int *ptr1;
int arr[10];
int *ptr2 = arr+20;
在这里,ptr1未初始化,使其无效,而ptr2超出了arr的范围,也使其变得脆弱。请注意,并非所有编译错误都是由错误的引用造成的。
什么是空指针
空指针不仅仅是一个错误的地址;它还指向无处。以下是将指针标记为空的两种方法:
int *ptr1 = 0;
int *ptr2 = NULL;
指向指针的指针是什么
在C++中,我们能够建立指向另一个指针的指针,该指针可能指向数据或另一个指针。在声明每个间接级别的指针的语法中,只需要一元运算符(*)。
char a;
char *b;
char ** c;
a = 'g';
b = &a
c = &b
这里b指向一个存储’g’的字符,c指向指针b。
什么是引用和指针
- 以值传递
- 以指针参数传递的引用
- 以引用参数传递的引用
示例
#include
using namespace std;
// Pass-by-Value
int square1(int n)
{cout << "address of n1 in square1(): " << &n << "\n";
n *= n;
return n;
}
// Pass-by-Reference with Pointer Arguments
void square2(int* n)
{
cout << "address of n2 in square2(): " << n << "\n";
*n *= *n;
}
// Pass-by-Reference with Reference Arguments
void square3(int& n)
{
cout << "address of n3 in square3(): " << &n << "\n";
n *= n;
}
void example()
{
// Call-by-Value
int n1 = 8;
cout << "address of n1 in main(): " << &n1 << "\n";
cout << "Square of n1: " << square1(n1) << "\n";
cout << "No change in n1: " << n1 << "\n";
// Call-by-Reference with Pointer Arguments
int n2 = 8;
cout << "address of n2 in main(): " << &n2 << "\n";
square2(&n2);
cout << "Square of n2: " << n2 << "\n";
cout << "Change reflected in n2: " << n2 << "\n";
// Call-by-Reference with Reference Arguments
int n3 = 8;
cout << "address of n3 in main(): " << &n3 << "\n";
square3(n3);
cout << "Square of n3: " << n3 << "\n";
cout << "Change reflected in n3: " << n3 << "\n";
}
// Driver program
int main() { example(); }
输出