簡體   English   中英

需要幫助了解c中的指針

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM