int valor = 123; //Supongamos que tiene dirección de memoria 1000
int* apuntadorValor = &valor; //Ahora el contenido de apuntadorValor es 1000
*apuntadorValor = 456; //Ahora el contenido de valor es 456
比直接改变价值?
valor = 456;
答案就在于 C 的起源。C 可以被认为是高级语言,因为它比汇编语言具有更高的抽象,但它也可以被认为是中级语言,因为它提供了语法避免抽象的选项。紧密。C 的设计目的是提供一种比汇编语言更接近程序员的语法,但又不放弃直接操作内存地址的可能性。之所以如此,是因为它旨在创建操作系统。使用指针比变量本身更容易操作比原始变量(例如整数、浮点数...)更复杂的数组和数据结构。将指针作为参数传递给函数比传递变量更容易和更快,因为在第一个中我们只传递内存地址,而在第二个中我们传递变量的绝对副本。使用指针来操作变量的原因还有很多,您可以在C 语言的优秀参考书。
Java中有指针吗?
严格来说,是的:在 Java 中,您有两种类型的变量,原始变量(如 int、double、boolean)和引用变量,或者通过 new 运算符实例化的任何用户定义的数据类型。但是,与 C 不同,在 Java 中我不能使用指针算术。在 C 中,指针运算包括对内存地址执行“加法”或“减法”操作,例如:获取 age 变量的内存地址,将地址加 4 并将值 8 存储在结果地址中。允许它有两个原因:首先,因为 Java 虚拟机以一种对程序员绝对透明的方式来处理这个问题,其次,因为在语言的设计中,他们认为这是不必要和不安全的,实际上,在C,不负责任地处理指针会造成很多麻烦。进行指针运算可能会访问程序没有访问权限的内存地址,并破坏操作系统所需的数据。Java 中的引用变量实际上是存储对象属性的内存区域的别名,类似于 C,其确切表示取决于所使用的 Java 虚拟机。
指针是“指向”另一个变量的对象,通常使用变量的地址。在 C 中,与其他命令式语言类似,您可以在如下语句中声明和定义变量:
当程序执行时,操作系统会授予它一个适当的内存区域来存储正在执行的程序的代码,以及一个数据区域来存储程序使用的变量的内容和程序将使用的其他区域为了它的执行,正确的执行。在上面的示例中,变量年龄和体重将位于该数据区域中。
作为程序员,您无法控制创建这些变量的内存位置,这取决于操作系统和编译器的实现。上图显示了一个可能的赋值:age 变量位于内存地址编号 1000 并包含值 3,权重变量位于内存地址编号 1004 并包含值 4.4。变量的名称没有显示在图表中,因为当它们被执行时,它们就失去了意义:在非常低的级别上,没有变量名称,只有内存地址,您在硬件级别对这些变量执行的所有操作都是它们通过修改内存地址的值来完成的操作,如果在您的程序中以下指令是:
编译器将此语句翻译如下:
因此,结果是在内存地址 1000 中,内容不再是 3 而是 4。通过上面我试图解释在低级别机器不理解变量名称,而是内存地址和在这些内存中完成的操作地址。变量的名称只对程序员有用,正是为了抽象出这些依赖于操作系统和编译器的细节。
在这里,称为指针的变量发挥作用,指针是存储另一个变量的内存地址的变量。在 C 中,您可以像这样声明一个指针:
前面的指令表明它声明了一个指针(由星号表示)指向一个称为pointerAge的整数(int)类型变量,因为这也是一个变量,它将在数据区域中有一个内存地址:
上图显示它位于内存地址1008,正如我提到的,这个变量的内容是另一个整数类型变量的内存地址,因为我想存储年龄变量的地址(我只会在时间)。执行),我指出以下指令:
C 中的 & 运算符返回变量所在的内存地址。因此,数据区域的内容现在是:
让我们看看发生了什么:我声明了一个名为 age 的变量,这个变量的内存地址是 1000,因为这是操作系统决定的。同时创建一个名为agePointer的指针变量,我将在其中存储age变量的内存地址,即agePointer的值为1000。
完成后,我可以使用指针修改年龄变量的内容,因为我已经知道它的内存地址。我使用 C 中的 * 取消引用运算符来执行此操作:
上面的语句相当于“找到存储变量AgePointer的内存地址并赋值8”。所以你会看到变量存储内存地址 1000,然后它会转到内存地址 1000,旧值 (3) 会将其更改为 8。
指针用作操作其他变量内容的间接方式。自然的问题是为什么不直接操作变量而不是创建指针?即这样做有什么好处
比直接改变价值?
答案就在于 C 的起源。C 可以被认为是高级语言,因为它比汇编语言具有更高的抽象,但它也可以被认为是中级语言,因为它提供了语法避免抽象的选项。紧密。C 的设计目的是提供一种比汇编语言更接近程序员的语法,但又不放弃直接操作内存地址的可能性。之所以如此,是因为它旨在创建操作系统。使用指针比变量本身更容易操作比原始变量(例如整数、浮点数...)更复杂的数组和数据结构。将指针作为参数传递给函数比传递变量更容易和更快,因为在第一个中我们只传递内存地址,而在第二个中我们传递变量的绝对副本。使用指针来操作变量的原因还有很多,您可以在C 语言的优秀参考书。
Java中有指针吗?
严格来说,是的:在 Java 中,您有两种类型的变量,原始变量(如 int、double、boolean)和引用变量,或者通过 new 运算符实例化的任何用户定义的数据类型。但是,与 C 不同,在 Java 中我不能使用指针算术。在 C 中,指针运算包括对内存地址执行“加法”或“减法”操作,例如:获取 age 变量的内存地址,将地址加 4 并将值 8 存储在结果地址中。允许它有两个原因:首先,因为 Java 虚拟机以一种对程序员绝对透明的方式来处理这个问题,其次,因为在语言的设计中,他们认为这是不必要和不安全的,实际上,在C,不负责任地处理指针会造成很多麻烦。进行指针运算可能会访问程序没有访问权限的内存地址,并破坏操作系统所需的数据。Java 中的引用变量实际上是存储对象属性的内存区域的别名,类似于 C,其确切表示取决于所使用的 Java 虚拟机。
指针基本上是一个存储内存地址的变量。而这个地址的内容将取决于指针的类型。例如:
我正在做的是告诉它指针将包含一个整数变量的内存地址。我想我已经很清楚了,否则我尝试用另一种方式来解释它。