了解指针?

正如标题所示,我无法准确理解指针是什么以及它们被使用的原因。 我已经搜索了一下但仍然不太懂。 我主要在Objective-C工作,但从我读过的内容来看,这更像是一个C主题(所以我添加了两个标签)。

根据我的理解,前面带星号的变量指向内存中的地址? 我不太明白为什么你使用指向值的指针而不是仅仅使用值本身。

例如:

NSString *stringVar = @"This is a test."; 

在这个字符串上调用方法时,为什么它是指针而不是直接使用字符串? 为什么不使用指向整数和其他基本数据类型的指针?

有点偏离主题,但我是否正确标记了这个? 在我编写它时,我认为它更像是一个编程概念,而不是特定于语言的东西,但它确实专注于Objective-C,所以我用objective-c和c标记它。

我不太明白为什么你使用指向值的指针而不是仅仅使用值本身。

当您想要引用值的特定实例而不是该值的副本时,可以使用指针。 假设你想让我加倍一些价值。 你有两个选择:

  • 你可以告诉我它的价值是什么 :“5”:“请为我加倍。” 这被称为价值传递。 我可以告诉你,答案是10,但如果你有5个写下来,那5个仍然会在那里。 提到那篇论文的任何人都会看到5。

  • 你可以告诉我价值在哪里 :“请删除我在这里写下的数字,并在其位置写下两倍的数字。” 这被称为通过引用传递。 当我完成后,原来的5个已经消失,并且它的位置有10个。 提到那篇论文的任何人现在都会看到10。

指针用于指代某些内存,而不是复制某些内存。 当您通过引用传递时,您将指针传递给您正在谈论的内存。

在这个字符串上调用方法时,为什么它是指针而不是直接使用字符串?

在Objective-C中,我们总是使用指针来引用对象。 技术原因是对象通常在堆中动态分配,因此为了处理对象,您需要它的地址。 考虑它的一种更实际的方法是,根据定义,对象是某个类的特定实例 。 如果将对象传递给某个方法,并且该方法修改了该对象,那么您希望之后更改传入的对象,为此,我们需要通过引用而不是按值传递对象。

为什么不使用指向整数和其他基本数据类型的指针?

有时我们使用指向整数和其他基本数据类型的指针。 但是,一般情况下,我们会按值传递这些类型,因为它更快。 如果我想向您传达一些小数据,那么直接向您提供数据比告诉您在哪里可以找到信息更快。 但是,如果数据很大,则情况恰恰相反:我告诉你,起居室里有一本字典比我背诵字典的内容要快得多。

我想也许你在指针变量的声明和指针的使用之间有点混淆。

任何带有星号的数据类型都是数据类型值的地址。

所以,在C中,你可以这样写:
char c;
这意味着c的值是单个字符。 但
char *p;
是char的地址。

类型名称后面的’*’表示变量的值是该类型事物的地址

我们在c中加一个值:
c = 'H';

所以
char *p;
表示p的值是字符的地址。 p不包含字符,它包含字符的地址。

C运算符&得到一个值的地址,所以
p = &c;
意味着将变量c的地址放入p。 我们说’p点在c’。

现在这里有点奇怪的部分。 字符串中第一个字符的地址也是字符串开头的地址。

因此对于
char *p = "Hello World. I hope you are all who safe, sound, and healthy";
p包含’H’的地址,并且隐含地,因为字符是连续的,p包含字符串开头的地址。

要获取字符串开头的字符’H’,请使用’get at the thing指向’运算符,即’*’。

所以*p是’H’

p = &c; if (*p == c) { ... is true ... }

当调用函数或方法时,要使用字符串,只需要将字符串的起始地址(通常为4或8个字节)传递给函数,而不是整个字符串。 这既有效,也意味着函数可以对字符串起作用并对其进行更改,这可能很有用。 这也意味着可以共享字符串。

指针是一个特殊变量,用于保存另一个变量的内存位置。

那么什么是指针…看看上面提到的定义。 让我们在下面的三个步骤中一步一步:

指针是一个特殊变量,用于保存另一个变量的内存位置。

所以指针只是一个变量……它是一个特殊的变量。 为什么它很特别,因为……读点2

指针是一个特殊变量,用于保存另一个变量的内存位置。

它保存另一个变量的内存位置。 通过内存位置我的意思是它不包含另一个变量的值,但它存储另一个变量的内存地址编号(可以这么说)。 这个其他变量是什么,读取点3。

指针是一个特殊变量,用于保存另一个变量的内存位置。

另一个变量可以是任何变量……它可以是float,int,char,double等。只要它是一个变量,它的创建存储位置就可以分配给一个指针变量。

我听说过一个对象就像一个气球,你拿着它的字符串就是指针。 通常,代码执行方式如下:

 MyClass *someObj = [[MyClass alloc] init]; 

alloc调用将为对象分配内存, init将根据类使用一组已定义的默认属性对其进行实例化。 您可以覆盖init

指针允许将引用传递给内存中的单个对象到多个对象。 如果我们使用没有指针的值,您将无法在两个不同的位置引用内存中的相同对象。

NSString *stringVar = @"This is a test.";

在这个字符串上调用方法时,为什么它是指针而不是直接使用字符串?

这是一个相当存在的问题。 我会这样说:如果不是它的位置,字符串什么? 如果你不能以某种方式引用对象,你将如何实现一个系统? 确切地说,名字……那个名字是什么? 机器如何理解它?

CPU具有与操作数一起使用的指令。 “将x添加到y并将结果存储在此处。” 这些操作数可以是寄存器(例如,对于32位整数,就像i在谚语for循环中可能存储的那样),但那些数量有限。 我可能不需要说服你需要某种forms的内存。 然后我会说,如果不是指针,你怎么告诉CPU在内存中找到那些东西?

您:“将x添加到y并将其存储在内存中。”
CPU:好的。 哪里?
你:呃,我不知道,喜欢,哪里……

在最低级别,它不像最后一行那样工作。 您需要更具体地使CPU工作。 🙂

实际上,所有指针都是“X处的字符串”,其中X是整数。 因为为了做某事你需要知道你在哪里工作。 就像你有一个整数数组a ,你需要a[i]i对你有意义。 那有什么意义? 那取决于你的程序。 但你不能争辩说i不应该存在。

实际上在其他语言中,你也在使用指针。 你只是没有意识到这一点。 有些人会说他们更喜欢这种方式。 但最终,当你深入了解所有抽象层时,你需要告诉CPU要查看哪个内存部分。 :-)所以我认为指针是必要的,无论你最终建立什么样的抽象。

回答你的每个问题:

(1)根据我的理解,前面带星号的变量指向内存中的地址?

你可以或多或少地看到它。 星号是一个解除引用运算符 ,它接受一个指针并返回指针中包含的地址的值。

(2)我不太明白你为什么要使用指向值的指针而不仅仅是使用值本身。

因为指针允许不同的代码段共享信息,所以比在这里和那里复制值更好,并且还允许通过被调用的函数修改指向的变量或对象。 此外,指针启用了复杂的链接数据结构。 阅读这个简短的教程指针和内存 。

(3)为什么不使用指向整数和其他基本数据类型的指针?

String是一个指针 ,与int或char不同。 字符串是指向包含字符串的数据的起始地址的指针,并从数据的起始地址返回所有值,直到结束字节。

例如,string是比char或int更复杂的数据类型。 事实上,不要认为sting类似于int的类型。 string是指向一块内存的指针。 由于它的复杂性,像NSString这样的类提供有用的function来使用它们变得非常有意义。 见NSString 。

使用NSString ,不创建字符串; 您创建一个对象 ,该对象包含指向字符串起始地址的指针 ,此外还有一组方法,允许您操作数据的输出。