指针与变量,目标-C
我很难掌握一些概念。谢谢你的帮助 假设您有以下代码:指针与变量,目标-C,c,objective-c,C,Objective C,我很难掌握一些概念。谢谢你的帮助 假设您有以下代码: int *intPtr; // creates a pointer int count = 10; // initiates an intiger variable intptr = &count; // ?? int count; &运算符为变量提供地址,在本例中为整数计数。然后将地址分配给intptr。我的问题是:为什么是intptr=count不足。我知道,count是一个变量,intptr是一个指针,但变量不也是指内存
int *intPtr; // creates a pointer
int count = 10; // initiates an intiger variable
intptr = &count; // ??
int count;
&
运算符为变量提供地址,在本例中为整数计数
。然后将地址分配给intptr
。我的问题是:为什么是intptr=count代码>不足。我知道,count
是一个变量,intptr
是一个指针,但变量不也是指内存中的某个位置吗
Hans计数指变量的值。您不希望将count的值分配给intptr,而是希望分配count的地址。因此使用了&运算符
如果您执行intptr=count,在这种情况下,您将指向内存地址10,它肯定在系统内存中,而不是在应用程序内存中,您将崩溃。变量是内存中的一个位置,而指针指的是内存中的一个位置(它所指的位置可以随时间而变化)
在您的示例中,如果您说intptr=count
,那么您的意思仍然很明显(可以想象,编写一个编译器也可以猜到这一点)。但是,这会导致您可以使用的语法类型不一致。表达式的值称为左值,如果它引用可以赋值的对象,则称为左值,否则称为右值。如果编译器执行了您似乎建议的那种“猜测”,那么类型为int
(即左值的表达式)的部分(但不是全部)表达式将自动转换为指针。在某些情况下,这可能会导致非常混乱的错误消息。您仍然可以执行intptr=count,但这不会达到您所困惑的目的
您可能希望将指针指向内存中的地址,如果上帝保佑,count中的值是有效的地址位置,那么您可能也不会出现分段错误
当然,每个变量都指向内存中的某个位置,但这并不意味着将两种不同的变量等同起来,就会产生一种基于上述事实可以假设的行为。对于int变量和指针INT.< /P>< P>,在C或ObjuleC或C++编程中使用的一些函数中,有一个定义明确的定义,必须将“引用”作为一个参数传递给值(换句话说,指针),而不是变量。
以这段代码为例:
int *intPtr; // creates a pointer
int count = 10; // initiates an intiger variable
intptr = &count; // ??
int count;
//是用于读入值的C方法/函数
//(数字或字符)从命令行
scanf("%i", &count);
如果您尝试了相同的方法,如果没有“&”(的地址),您将得到编译时错误或运行时错误(取决于您在Win/Linux/OSX上工作的系统,因为每个编译器将执行一些不同的操作。[GCC、MingW等])
变量使用内存,并在程序完成之前一直保留在内存中,在此之前您无法恢复该内存
其中,当程序运行时,可以使用dealoc方法从内存中释放“指针”,并且在应用程序执行过程中释放内存。理解指针实际上具有不同的数据类型很重要
int
变量将保存整数值
指针
变量将保存内存地址
因此,将int变量分配给指针变量是不正确的(正如您所建议的intptr=count;
)
我相信使用typedef
可以帮助您更好地理解差异
下面是一个小例子:
#include <stdio.h>
typedef int* int_pointer;
int main() {
int n; // integer
int_pointer p; // pointer
n = 5;
p = &n; // p's value is now n's address
*p = *p + 1; // add 1 to the value stored at the location that p points to
// and put that value back in the same location
printf("n = %d\n", n);
printf("*p = %d\n", *p);
return 0;
}
谢谢你的回答。我现在明白了区别。汉斯