指针与变量,Objective-C

时间:2010-08-06 13:15:17

标签: c objective-c

我在掌握一些概念方面遇到了一些困难。感谢帮助。

假设你有以下代码:

int *intPtr;   // creates a pointer
int count = 10; // initiates an intiger variable
intptr = &count; // ??

&运算符为变量提供地址,在本例中为整数count。然后将地址分配给intptr。我的问题是:为什么intptr = count;不够。我知道count是一个变量而intptr是一个指针,但它不是一个变量,也只是指内存中的某个位置?

汉斯

5 个答案:

答案 0 :(得分:8)

count表示变量的VALUE。您不希望将count的值赋给intptr,您想要分配count的地址。因此&使用运算符。

如果你执行intptr = count,在这种情况下你会指向内存地址10,这肯定是在系统内存中,而不是你的应用程序内存,你就会崩溃。

答案 1 :(得分:5)

重要的是要理解指针实际上有不同的数据类型。

int变量将保存整数值。

pointer变量将保存内存地址。

所以将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;
}

此程序将打印

n = 6
*p = 6

答案 2 :(得分:1)

变量 是内存中的一个位置,而指针指的是内存中的位置(它引用的位置可能随时间变化)。

在你的例子中,如果你说intptr = count那么你的意思仍然是显而易见的(并且可以想象一个编译器也可以这样写)。但是,它会导致您可以使用的语法类型不一致。表达式的值称为左值,如果它引用可以分配的内容,则为 rvalue 。如果编译器做了你似乎建议的那种“猜测”,那么类型int的一些但不是所有的表达式(即lvalues)会被自动转换成指针。在某些情况下,这可能会导致非常混乱的错误消息。

答案 3 :(得分:0)

你仍然可以做intptr = count,但这不会达到你的困惑。

您可能希望指针指向内存中的地址,如果在上帝的恩典中,count中的值是有效的地址位置,那么您可能也不会得到分段错误。

当然,每个变量都指的是记忆中的某个位置,但这并不意味着等同两种不同的类型会产生一种基于上述事实可以假设的行为。对于int变量和指向int的指针,有明确定义的定义。

答案 4 :(得分:0)

在C或Objective-C或C ++编程中使用的某些函数中,必须将值“引用”(换句话说,指针)作为参数传递,而不仅仅是变量。

拿这段代码:

int count;

//是一个用于读取值的C方法/函数 //命令行中的(数字或字符)。

scanf("%i", &count); 

如果你尝试了同样的事情,没有“&amp;” (地址)你会得到编译时错误或运行时错误(取决于你在Win / Linux / OSX上运行的系统,因为每个编译器都会做一些不同的事情。[GCC,MingW等...])< / p>

变量使用内存,并在程序完成之前保留在内存中,并且在此之前无法恢复该内存。

当程序运行时,可以通过使用dealloc方法从内存中释放“指针”,并在执行应用程序期间释放该内存。