需要帮助理解c中的指针

时间:2011-03-08 15:29:55

标签: objective-c c pointers concept

我无法理解指针概念,下面是代码。为什么交换(& a1,& a2)输出-5,6而不是6,-5?这些值已经交换了吗?

void swap(int *ptr1, int *ptr2){

     int temp;

      temp = *ptr1;
      *ptr1 = *ptr2;
      *ptr2 = temp;

}

int main (int argc, char *argv[]){

    void swap(int *ptr1, int *ptr2);
    int a1 = -5;
    int a2 = 6;
    int *p1 = &a1;
    int *p2 = &a2;

    NSLog(@" a1 = %i, a2 =%i", a1, a2); // out puts: -5, 6

    swap(p1,p2);
    NSLog(@" a1 = %i, a2 =%i", a1, a2); // out puts: 6, -5

    swap(&a1, &a2);
    NSLog(@" a1 = %i, a2 =%i", a1, a2); // out puts: -5, 6
}

3 个答案:

答案 0 :(得分:7)

你第一次调用swap()交换了两个值,第二个调用交换了它们。

答案 1 :(得分:0)

你每次都在交换相同的东西(sorta)所以先交换它们,然后再交换它们。 a1将值-5存储在address1(地址是内存中的位置) a2将值6存储在addess2中 p1指向addres1 p2指向address2 交换p1和p2 在这里,您获取存储在address1的项目的值,并使用address2处的项目值进行切换。 所以现在 address1保持值6,address2保持值-5 这里p1和p2仍然指向相同的地址,a1和a2仍然返回来自相同地址的值,但这些值已被交换。 交换& a1和& a2 交换& a1和& a2做同样的事情,&将地址作为指针返回,然后将它们传递给交换函数。交换接收指针并交换它们指向的地址的值。

基本上,指针指向内存位置。您的交换函数占用内存位置并交换存储在其中的数据,它不会更改它们指向的内存地址。因此,在这两种情况下,您发送的是相同的地址,因此您将相同的地址交换两次。

答案 2 :(得分:0)

一个非常简单的例子,只是为了感受一下指针...

int i = 2; // i == 2
int *p = &i; // p == 0x00AB (say memory addres of i is 171)
int *q = p;  // q == 0x00AB q and p have the same value

p == q是真的

* p == 2是真的

* p == * q为真

p = NULL;      // initializes the pointer, which is a good practice
if (*p == 2) { // don't do this as it can cause error or unpredictable results

i == 2仍然是真的,无论你用指针变量做了什么

指针变量可以看作或被认为是持有“特殊”整数值,它们存储一个内存地址,通常是32位数字(除非你在64位地址计算机上运行)。