C++ 指针

C++ 指针

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

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

语法

datatype *var_name; 
int *ptr;   // ptr can point to an address which holds int data 

如何使用指针

  1. 创建一个指针变量。
  2. 使用一元运算符(&)获取变量的地址,将指针赋值为变量的地址。
  3. 使用一元运算符(*),通过提供的地址参数获取变量存储的值。

由于数据类型知道信息占用多少字节,我们将其与引用关联起来。当我们增加一个指针时,会加上指向的数据类型的大小。

C++ 指针

指针的优点

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。

什么是引用和指针

  1. 以值传递
  2. 以指针参数传递的引用
  3. 以引用参数传递的引用

    示例

#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(); }

输出

C++ 指针

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程