天天看點

黑馬程式員——C語言指針

---------------------- ASP.Net+Unity開發、.Net教育訓練、期待與您交流! ----------------------

   今天看了李明傑老師的C語言基礎部分,當然自己感覺也是最難的部分,也就是指針。

   首先呢,要明白指針儲存的是一個變量的位址。說白了指針就是一個位址(亂說的。。。)

下面是一段很經典的利用指針對函數進行操作來交換兩個數的代碼

#include <stdio.h>


//void swap(char v1, char v2) {
//    printf("交換之前之前:v1=%d,v2=%d\n", v1, v2);
//    
//    char temp;
//    
//    temp = v1;
//    v1 = v2;
//    v2 = temp;
//    
//    printf("調用函數之後:v1=%d,v2=%d\n", v1, v2);
//}

void swap(char *v1, char *v2) {
    char temp;
    
    temp = *v1;
    *v1 = *v2;
    *v2 = temp;
}

int main(int argc, const char * argv[])
{
    char a = 10;
    char b = 9;
    
    printf("調用函數之前:a=%d,b=%d\n", a, b);
    
    swap(&a, &b);
    
    printf("調用函數之後:a=%d,b=%d\n", a, b);
    return 0;
}
           

定義一個指針使用的方式就是 類型 *變量名 such as :int *p;意思就是定義一個int類型的指針變量。

還有一個很難了解的就是在定義指針之後,在使用他的時候就不能在後面加*号了,加*号的意思是調用指針儲存的位址空間的值。

such as:int *p;int a=0; p=&a;那麼*p就是調用p指針儲存的位址空間的值,也就是a的值為0。

下面一段代碼也是很經典的用一個函數傳回兩個值

#include <stdio.h>

int sumAndMinus(int v1, int v2, int *p) {
    *p = v1 - v2;
    return v1 + v2;
}

int main(int argc, const char * argv[])
{
    int a = 10;
    int b = 4;
    
    // 接收a跟b的和
    int sum;
    // 接收a跟b的差
    int minus;
    
    sum = sumAndMinus(a, b, &minus);
    
    printf("sum=%d, mimus=%d", sum, minus);
    return 0;
}
           

這也就是通過指針實作的功能,通過指針将一個變量傳入函數,然後改變這個指針儲存的位址空間的值。

#include <stdio.h>

void test() {
    char a;
    // a = 10; 直接引用
    
    // 定義了一個指針變量b,而且b隻能指向char類型的變量
    char *b;
    
    // 讓指針變量b指向a
    b = &a;
    
    // 這裡的*b代表:通路b值對應的存儲空間(也就是變量a的存儲空間)
    // 相當于a = 10;
    *b = 10;
    
    printf("%d\n", a);
    
    a = 11;
    
    // 這裡的*b相當于取出變量a存儲的值
    printf("%d\n", *b);
}

void test1() {
    char a = 10;
    
    char *b = &a;
    /* 相當于下面兩句
     char *b;
     b = &a;
     */
}

void test2() {
    // 這是錯誤的做法
    char *p;
    // 應該在指針确定指向的變量後,再進行相應的操作
    *p = 10;
}

void test3() {
    // 這個錯發也是錯誤的
    char *p;
    // 指針變量是用來存儲變量位址的,不能随便指派一個常數,除非你這個常熟恰好是某個變量的位址
    p = 100;
}

int main(int argc, const char * argv[])
{
    
    return 0;
}
           

上面這段代碼是李明傑老師寫的,很清晰的講明了什麼是指針。

---------------------- ASP.Net+Unity開發、 .Net教育訓練、期待與您交流! ----------------------

繼續閱讀