c語言入門到c++使用高手: c語言入門之指針(九)

第九章 指針

第九節 指針數組, 指針的指針, main函數參數, 小節

1. 指針數組概念回顧

  • 一個數組,其元素均爲指針類型數據,稱爲指針數組,

  • 指針數組的定義形式:
    類型標識符 *數組名[數字長度說明] //int *p[4],每個數組元素都可以看作是一個指針變量,
    都可以指向一個指針變量

  • 數組指針 int (*p)[4],指向一維數組的指針變量

#include <iostream>
#include <cstring>

int main() {
    //指針數組
    char *pName[] = {"C++", "JAVA", "PYTHON", "GO", "CSHARP"};
    int bytes = sizeof(pName);//每個指針變量佔8個字節,這點要注意!!
    printf("bytes of pName: %d\n", bytes);
    int len = sizeof(pName) / sizeof(char *);
    printf("length of pName: %d\n", len);
    printf("%d\n", sizeof(char));

    char *p2 = "JAVA";//把字符串的首地址賦給指針

    int i;
    for (i = 0; i < len; i++) {
        printf("pName[%d]: %s\n", i, pName[i]);
    }
    printf("************************\n");

    char *ptmp;
    ptmp = pName[0];//ptmp指向C++
    pName[0] = pName[1];//pName[0]指向JAVA
    pName[1] = ptmp;//pName[1]指向C++
    for (i = 0; i < len; i++) {
        printf("pName[%d]: %s\n", i, pName[i]);
    }
    printf("************************\n");

    return 0;
}

2. 指向指針的指針

  • 用來指向指針變量的變量,簡稱指向指針的指針
 // *(*p)表示指針變量p指向指針變量,*p是p所指向的指針變量
 char **p;//定義了一個指向字符串指針變量的指針變量
 int **pInt;//定義了一個指向整型指針變量的指針變量

  • 實例
#include <iostream>
#include <cstring>

int main() {
    //指針數組
    char *pName[] = {"C++", "JAVA", "PYTHON", "GO", "CSHARP"};
    char **pp;//定義了一個指向字符串指針變量的指針變量
    pp = &pName[0];//*pp = pName[0]
    printf("*pp = %s\n", *pp);

    int abc = 5;
    int *pabc = &abc;//指向整型數據的指針
    int **ppabc = &pabc;//指向指針的指針
    printf("abc = %d\n", abc);
    printf("*pabc = %d\n", *pabc);
    printf("**ppabc = %d\n", **ppabc);
    return 0;
}

3. 指針數組做main函數形參

  • 指針數組的重要應用是能夠做main函數的參數

  • 指針數組可以接收不確定長度的參數,靈活性很強

#include <iostream>
#include <cstring>

//添加了兩個形參,第一個形參整型,第二個形參是指針數組
// argc保存的是argv指針數組的元素個數
// argv[0]保存的是當前可執行文件的完整路徑文件名

int main(int argc, char *argv[]) {
    int i;
    printf("argc: %d\n", argc);
    for (i = 0; i < argc; i++) {
//        printf("argv[%d]: %s\n", i, argv[i]);
        printf("argv[%d]: %s\n", i, *argv);
        argv++;
    }
    return 0;
}

4. 本章小節

指針數據類型

定義 含義
int i 定義整型變量
int *p p爲指向整型數據的指針變量
int a[n] 定義整型數組a,它有n個元素
int *p[n] 定義指針數組p,它由n個指向徵信數據的指針元素組成
int (*p)[n] p爲指向包含n個元素的一維數組數組的指針變量
int f() 函數f,返回一個整型值
int *p() 函數p,返回一個指針,這個指針指向一個整型數據
int (*p)() p是一個指向函數的指針,這個函數返回一個整型值
int **p p是一個指針變量,指向另外一個整型數據的指針

指針運算小結

  • 指針變量的加減(p++, p–)

  • 指針變量的賦值(int *p,不能直接賦值地址),只能夠將變量已經分配的
    地址賦值給指針變量

  • 指針變量可以爲空值,表示不指向任何變量

// NULL就是整數0,使p指向地址爲0的單元
// 系統會保證地址爲0這個單元不存放任何有效數據
int *p = NULL;
if (p == NULL){
    p = &a
}
  • void*型指針:萬能型指針變量
#include <iostream>
#include <cstring>

int main(int argc, char *argv[]) {
    int a = 3;
    int *p = &a;

    float bf = 56.f;
    float *pf = &bf;

    void *pwn = NULL;
    pwn = p;
    pwn = pf;
    pf = (float *) pwn;

    return 0;
}

總結

  • 優點: 效率高

  • 缺點: 太過靈活

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章