C ++中的指针

指针是一种非常强大的编程工具。它们可以使某些事情变得容易得多,有助于提高程序的效率,甚至允许您处理无限量的数据。例如,使用指针是让函数修改传递给它的变量的一种方法。也可以使用指针来动态分配内存,这意味着您可以编写可以处理几乎无限量的数据的程序-您无需知道在编写程序时需要多少内存需要。哇,真酷。实际上,这非常酷,我们将在接下来的一些教程中看到。现在,让我们仅了解什么是指针以及如何使用它们的基本知识。

什么是指针?你为什么要在乎呢?
指针被恰当地命名:它们“指向”内存中的位置。想想当地一家银行的一排各种大小的保险箱。每个保险箱都会有一个与之关联的数字,以便柜员可以快速查找它。这些数字就像变量的内存地址。安全保管箱中的指针将仅仅是存储另一个安全保管箱编号的任何内容。也许您有一个有钱的叔叔,他在贵重的保险箱中存放了贵重物品,但决定将实际位置放在另一个较小的保险箱中,该保险箱中只存储着一张卡片,上面有装有真实珠宝的大箱子。带有卡的保险箱将存储另一个盒子的位置。它相当于一个指针。在电脑上

很棒的事情是,一旦您可以谈论变量的地址,便可以转到该地址并检索存储在其中的数据。如果您碰巧要传递给函数大量数据,那么将其位置传递给函数比复制数据的每个元素要容易得多!此外,如果您的程序需要更多的内存,则可以从系统请求更多的内存-如何“返还”该内存?系统会告诉您它在内存中的位置;也就是说,您将获得一个内存地址。并且您需要指针来存储内存地址。

关于术语的注释:单词指针可以指向内存地址本身,也可以指向存储内存地址的变量。通常,区别并不那么重要:如果将指针变量传递给函数,则将传递存储在指针中的值-内存地址。当我要谈论一个内存地址时,我将其称为内存地址。当我想要一个存储内存地址的变量时,我将其称为指针。当一个变量存储另一个变量的地址时,我会说它是“指向”该变量的。
C ++指针语法
指针需要一些新的语法,因为当您拥有一个指针时,您需要能够请求它存储的存储位置和存储在该存储位置的值。此外,由于指针有些特殊,因此当您声明指针变量该变量是指针时,您需要告诉编译器,并告诉编译器它指向什么类型的内存。

指针声明如下所示:

<variable_type> *<name>; 

例如,您可以使用以下语法声明一个存储整数地址的指针:

int *points_to_integer;

注意*的使用。这是声明指针的关键。如果将其直接添加到变量名之前,它将声明该变量为指针。次要提示:如果在同一行上声明多个指针,则必须在每个指针之前加上星号:

// one pointer, one regular int
int *pointer1, nonpointer1;
 
// two pointers
int *pointer1, *pointer2;

如前所述,有两种方法可以使用指针访问信息:可以使指针将实际地址提供给另一个变量。为此,只需使用不带的指针名称即可。但是,要访问实际的内存位置及其中存储的值,请使用。这样做的技术名称是取消引用指针。本质上,您将引用某个内存地址,然后跟随它来检索实际值。跟踪何时应添加星号可能很棘手。请记住,指针的自然用途是存储一个内存地址。因此,当您使用指针时:

call_to_function_expecting_memory_address(pointer);

然后计算得出该地址。您必须添加一些额外的星号,以便检索存储在地址中的值。您可能会做很多这样的事情。但是,指针本身应该存储一个地址,因此当您使用裸指针时,您将获得该地址。
指向某物:检索地址
为了使指针实际指向另一个变量,必须同时具有该变量的内存地址。要获取变量的内存地址(其在内存中的位置),请在变量名称前添加&符号。这使它给出其地址。这称为地址运算符,因为它返回内存地址。方便地,“&”号和“-”都以a开头。这是记住您使用&来获取变量地址的有用方法。

例如:

#include <iostream>
 
using namespace std;
 
int main()
{ 
  int x;            // A normal integer
  int *p;           // A pointer to an integer
 
  p = &x;           // Read it, "assign the address of x to p"
  cin>> x;          // Put a value in x, we could also use *p here
  cin.ignore();
  cout<< *p <<"\n"; // Note the use of the * to get the value
  cin.get();
}

cout输出存储在x中的值。这是为什么?好吧,让我们看一下代码。该整数称为x。然后将指向整数的指针定义为p。然后,使用地址运算符(&)获取变量的地址,从而将x的存储位置存储在指针中。使用&号有点像查看安全保管箱上的标签以查看其编号,而不是查看保管箱内部以获取其存储的内容。然后,用户输入一个存储在变量x中的数字。请记住,这是p指向的相同位置。

然后,下一行将* p传递给cout。* p在p上执行“取消引用”操作;它查看存储在p中的地址,然后转到该地址并返回该值。这类似于在安全保管箱内查看,只是找到另一个保管箱的编号(可能是该保管箱的钥匙),然后将其打开。

请注意,在上面的示例中,指针在使用之前已初始化为指向特定的内存地址。如果不是这种情况,则可能指向任何内容。这可能会给程序带来非常不愉快的后果。例如,操作系统可能会阻止您访问它不知道您的程序拥有的内存:这将导致您的程序崩溃。为避免程序崩溃,在使用指针之前,应始终对其进行初始化。

也可以使用空闲内存来初始化指针。这允许动态分配阵列内存。这对于设置称为链表的结构最有用。这个困难的话题对于本文来说太复杂了。但是,对关键字new和delete的理解将在将来极大地帮助您。

关键字new用于使用空闲存储中的内存(所有程序可用的内存部分)来初始化指针。语法类似于示例:

int *ptr = new int;

它初始化ptr以指向大小为int的内存地址(因为变量具有不同的大小,字节数,所以这是必需的)。指向的内存对其他程序不可用。这意味着谨慎的编码人员应在使用结束时释放该内存。

删除运算符释放通过new分配的内存。为此,语法如示例中所示。

delete ptr;

删除指针后,最好将其重置为指向0。将0分配给指针后,该指针将变为空指针,换句话说,它不指向任何内容。这样,当您对指针执行愚蠢的操作时(即使是有经验的程序员,这种情况也会发生很多),当您造成了相当大的损害时,您会立即发现而不是后来发现。

实际上,空指针的概念经常被用作指示问题的方式-例如,从C剩下的某些函数如果不能正确分配内存,则它们返回0(尤其是malloc函数)。如果您曾经使用malloc或其他在失败时返回“ NULL指针”的C函数,则需要确保正确处理此问题。

在C ++中,如果由于系统内存不足而对new的调用失败,则它将“引发异常”。目前,您不必太担心这种情况,但是您可以阅读更多有关new失败时发生的情况的信息。
盘点指针
指针一开始可能会让人感到困惑,但是我认为任何人都可以欣赏和理解它们。如果您不希望自己全神贯注于他们,那么请深呼吸一下,然后重新阅读本课。尽管您应该对它们的一些基本用法有所了解,但您不应该觉得自己已经完全掌握了何时以及为什么需要使用指针的所有细微差别。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值