C語言復習之指針

直接引用

  • 通過變量名引用變量,由系統自動完成變量名和其存儲地址之間的轉換,稱為變量的"直接引用"方式
char a;
a = 10;

程序對變量的讀寫操作,實際上是對變量所在的存儲空間進行寫入或取出數據。就上面的代碼而言,系統會自動將變量名a轉換為變量的存儲地址,根據地址找到變量a的存儲空間,然后再將數據10以2進制的形式放入變量a的存儲空間中


指針-----間接引用

  • 以變量a為例:首先將變量a的地址存放在另一個變量中,比如存放在變量b中,然后通過變量b來間接引用變量a,間接讀寫變量a的值。這就是"間接引用"。



    如果程序通過"間接引用"的方式來修改a的值,可以這樣做:先根據 變量名b 獲取 變量b 的地址ffc2,取出變量b中存儲的內容ffc1,也就是變量a的地址,再根據變量a的地址ffc1找到a的存儲空間,然后修改里面的數據。

  • 總結一句:用來存放變量地址的變量,就稱為"指針變量"。在上面的情況下,變量b就是個"指針變量",我們可以說指針變量b指向變量a。

指針的初始化

  • 先定義后初始化
// 定義int類型的變量a
int a = 10;
// 定義一個指針變量p
int *p;
// 將變量a的地址賦值給指針變量p,所以指針變量p指向變量a
p = &a;//注意:賦值給p的是變量a的地址&a
  • 定義的同時初始化
// 定義int類型的變量a
int a = 10;
// 定義一個指針變量p
// 并將變量a的地址賦值給指針變量p,所以指針變量p指向變量a
int *p = &a;

指針交換兩個變量的值

void change(int *a, int *b) {
    // 中間變量
    int temp ;

    // 取出a指向的變量的值
    temp = *a;

    // 取出b指向的變量的值,然后賦值給a指向的變量
    *a = *b;

    // 賦值給b指向的變量
    *b = temp;
}

int main(int argc, const char * argv[]) {
    
    int a = 10;
    int b = 4;
    
    change(&a, &b);
    printf("%d,%d\n",a, b);

    return 0;
}

利用指針返回多個參數(這里例子返回兩個)

  • 通常情況下,函數只能返回一個返回值。我們可以利用指針返回多個參數
int sunAndMinus(int a, int b, int *p) {
    *p = a - b;
    return a + b;
}

int main(int argc, const char * argv[]) {
   // 定義2個int型變量
    int a = 10;
    int b = 4;

    // 定義2個變量來分別接收和與差
    int sum;
    int minus;

    // 調用函數
    sum = sunAndMinus(a, b, &minus);
    
    // 打印和 
    printf("%d+%d=%d\n", a, b, sum);
    // 打印差
    printf("%d-%d=%d\n", a, b, minus);
    return 0;
}

利用指針遍歷數組元素

  • 第一種方式
int main(int argc, const char * argv[]) {
    
    int a[] = {1, 2, 3};
    int *p = a;
    for (int i = 0; i < 3; i ++) {
        printf("a[%d]=%d\n",i ,*(p + i));//p沒有改變
    }
    //p + i。是地址運算,不是真正的加1,它會根據你的數據類型來判斷p + 幾。比如上面是int 類型,所以當i = 0的時候,p + 0,當i = 1的時候,p + i就變成了p + 2。也就是一次性加2
    return 0;
}
  • 下面可以看出p + i具體加的是幾。


  • 第二種方式

int main(int argc, const char * argv[]) {
    
    int a[] = {1, 2, 3};
    int *p = a;
    for (int i = 0; i < 3; i ++) {
        printf("a[%d]=%d\n",i ,*(p ++));//p改變了
    }
    return 0;
}
  • 第三種方式
int main(int argc, const char * argv[]) {
    
    int a[] = {1, 2, 3};
    for (int i = 0; i < 3; i ++) {
      //a代表的是數組a的地址也就是a[0]的地址。同樣 a+i 是很具你的數據類型來定的。和上面 p+i 一樣。
        printf("a[%d]=%d\n",i ,*(a+i));
      //但是我們不能像上面第二中方式一樣a++,a++相當于a=a+1。因為數組名a,是一個常量,不能進行賦值運算!
    }
    return 0;
}

利用指針把函數當做參數傳到另一個函數中

//加法
int add(int a, int b) {
    return a + b;
}
//減法
int minus(int a, int b) {
    return a - b;
}
//乘法
int multiplication(int a, int b) {
    return a * b;
}
//------------不改變這個函數的情況下。更換算法
int algorithm(int a, int b, int (*p)(int, int)) {
    return p(a, b);
}

int main(int argc, const char * argv[]) {
    int result = algorithm(10, 6, multiplication);
    printf("%d\n", result);
    return 0;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容