我无法理解指针概念,下面是代码。为什么交换(& 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
}
答案 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位地址计算机上运行)。