![](/img/trans.png)
[英]Obj-C/Cocoa instance/pointers/properties Need help understanding an example
[英]Need help on understanding pointers in c
我在理解指針概念時遇到麻煩,下面是代碼。 為什么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
}
您第一次調用swap()交換了兩個值,第二次調用將它們交換回了。
每次都交換相同的東西(排序),因此首先交換它們,然后再交換回來。 a1將值-5存儲在地址1(地址是內存中的位置)a2將值6存儲在addess2中p1指向addres1 p2指向地址2交換p1和p2在這里,您獲取存儲在address1的項目的值並進行切換該項目的值位於address2。 因此,現在address1保留值6,address2保留值-5,此處p1和p2仍指向相同的地址,而a1和a2仍從相同的地址返回值,但這些值已交換。 交換&a1和&a2交換&a1和&a2做同樣的事情,&返回地址作為指針,您將它們傳遞給swap函數。 交換使用指針,並交換它們指向的地址的值。
基本上,指針指向一個內存位置。 您的交換功能將轉移到內存位置並交換存儲在其中的數據,但不會更改它們指向的內存地址。 因此,在兩種情況下,您都發送相同的地址,因此將相同的地址交換兩次。
一個非常簡單的例子,只是為了了解指針...
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位地址的計算機上運行)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.