1. 程式人生 > >C語言入門(十七)之指標的基本概念

C語言入門(十七)之指標的基本概念

如何定義指標變數

     普通變數:
     資料型別 變數名稱;
     
     指標變數:
     資料型別 * 變數名稱;
     
     資料型別 : 說明將來指標變數能夠儲存什麼型別的變數的地址
               注意: 指標變數是什麼型別, 那麼將來就只能儲存什麼型別變數的地址,
               例如: 指標變數是int型別, 那麼將來就只能儲存int型別變數的地址
     * : 沒有任何特殊含義, 僅僅是為了標示這是一個指標變數
     變數名稱 : 用於區分不同的變數

    int num; // 普通變數
    num = 10;
    
    int *p; // 指標 , 在64位編譯器下佔用8個位元組
    // 千萬注意: 指標變數只能儲存地址
    p = # // 將num的地址儲存到p這個指標中
    
    // p == &num
    printf("num = %p\n", &num);
    printf("p = %p\n", p);
    
    // 指標變數前的*號代表訪問指標變數指向的那一塊儲存空間
    // *p == num
    *p = 55;
    printf("num = %i\n", *p);
/ 指標就是專門用於儲存地址的
void change3(int *p) // 用什麼接收地址?   指標 = 0ffc13  int *p = #
{
    *p = 55;
    printf("哥被執行了\n");
}

1、交換兩個變數的值

#include <stdio.h>


void swap(int *v1, int *v2)
// int *v1 = &a, int *v2 = &b; v1 = 0ffc13 v2 = 0ffc9
// *v1 == a  *v2 == b
{
    int temp = *v1; // int temp = 0ffc13
    *v1 = *v2;
    *v2 = temp;
}

int main(int argc, const char * argv[]) {
    // 定義一個函式交換兩個變數的值
    int a = 10; // 0ffc13
    int b = 5; // offc9
    printf("交換前:a = %i, b = %i\n", a, b);
//    int temp = a;
//    a = b;
//    b = temp;
    swap(&a, &b);
    printf("交換後:a = %i, b = %i\n", a, b);
    return 0;
}

2、定義一個函式, 傳遞三個值, 返回這三個值得和,差,平局值

#include <stdio.h>
//int demo(int v1, int v2, int v3);
int demo(int v1, int v2, int v3, int *p1, int *p2);

int main(int argc, const char * argv[]) {
    // 要求定義一個函式, 傳遞三個值, 返回這三個值得和,差,平局值
    int a = 10;
    int b = 20;
    int c = 30;
//    int res =  demo(a , b , c);
//    printf("res = %i\n", res);
    
    // 定義三個變數用於儲存計算結果
    int res1 = 0; // 和
    int res2 = 0; // 差
//    int res3 = 0; // 平局值
    
    // *p1 == res1 *p2 == res2
    // 我們想要的就是呼叫完函式之後, 和差平均值對應的變數都被"修改"為對應的值
   int res3 = demo(a, b, c, &res1, &res2);
    
    printf("和 = %i, 差 = %i, 平均值 = %i\n", res1, res2, res3);
    
    return 0;
}

int demo(int v1, int v2, int v3, int *p1, int *p2)
{
    int sum = v1 + v2 + v3;
    *p1 = sum;
    int m = v1 - v2 - v3;
    *p2 = m;
    int average = sum / 3;
    
    return average;
    
    /*
    // 因為返回的是一個逗號表示式, 而逗號表示式的值是最後一個表示式的值, 所有返回的是average
//    return sum, m, average;
    */
    
    /*
    // return 連個作用 1.返回值給呼叫者 2.結束函式
    // 注意點: return後面不可以寫任何語句, 因為執行不到
    return sum;
    printf("--------------\n");
    return m;
    return average;
     */
}

指標注意點

指標的指向可以修改

    int a = 10;
    int b = 5;
    
    int *p = &a;
    *p = 88;
    
    p = &b;
    
    *p = 44;
    
    printf("%i\n", a);
    printf("%i\n", b);

指標型別是什麼型別, 就只能指向什麼型別的資料

多級指標

指向指標地址的指標,儲存的是指標的地址。

指標為什麼分型別

因為當我們利用指標去取值的時候, 系統就會自動根據指標的型別來確定應該取對少個位元組中的值

mac(64位)系統上,指標無論什麼型別,都佔8個位元組,因為

64=8*8

/*
    char *cp;
    int *ip;
    double *dp;
    double **dpp;
    // mac系統中的指標無論是什麼型別, 幾級真正都佔用8個位元組
    // 由於Mac是64位了,  32  = 4 * 8;  64 = 8 * 8;
    printf("cp = %lu, ip = %lu, dp = %lu, dpp = %lu\n", sizeof(cp), sizeof(ip), sizeof(dp), sizeof(dpp));
     */
    // 指標為什麼要分型別?
    // 因為當我們利用指標去取值的時候, 系統就會自動根據指標的型別來確定應該取對少個位元組中的值