0

我无法理解指针概念,下面是代码。为什么 swap(&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
}
4

3 回答 3

7

您对 swap() 的第一次调用交换了两个值,第二次调用将它们交换回来。

于 2011-03-08T15:32:30.253 回答
0

您每次都在交换相同的东西(排序)所以首先交换它们,然后再交换它们。a1 将值 -5 存储在 address1 (地址是内存中的一个位置) a2 将值 6 存储在 addess2 p1 指向 addres1 p2 指向 address2 交换 p1 和 p2 在这里您获取存储在 address1 的项目的值并切换它与地址 2 处的项目的值。所以现在 address1 保存值 6 并且 address2 保存值 -5 这里 p1 和 p2 仍然指向相同的地址, a1 和 a2 仍然从相同的地址返回值,但值已被交换。交换 &a1 和 &a2 交换 &a1 和 &a2 做同样的事情, & 返回地址作为指针,你将它们传递给交换函数。Swap 获取指针并交换它们指向的地址的值。

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

于 2011-03-08T15:46:07.817 回答
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 位地址计算机上运行)。

于 2011-03-08T17:28:19.040 回答