溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

C之?dāng)?shù)組指針和指針數(shù)組(二十九)

發(fā)布時(shí)間:2020-07-06 17:47:05 來(lái)源:網(wǎng)絡(luò) 閱讀:5827 作者:上帝之子521 欄目:編程語(yǔ)言

        我們今天來(lái)看下傳說(shuō)中的指針數(shù)組和數(shù)組指針。在 C 語(yǔ)言中,數(shù)組都有自己特定的類(lèi)型。那么數(shù)組的類(lèi)型是怎樣的呢?它是由元素類(lèi)型和數(shù)組大小共同決定的。比如 int array[5] 的類(lèi)型就是 int[5]

        在 C 語(yǔ)言中我們可以通過(guò) typedef 為數(shù)組類(lèi)型重命名,格式為:typedef type(name)[size];其中數(shù)組類(lèi)型可以這樣表達(dá):typedef int(AINT5)[5]; typedef float(AFLOAT10)[10];那么數(shù)組定義就可表示為:AINT5 iarray; AFLOAT10 farray;

        數(shù)組指針用于指向一個(gè)數(shù)組,數(shù)組名是數(shù)組首元素的起始地址但并不是數(shù)組的其實(shí)地址;通過(guò)取地址符 & 作用于數(shù)組名可以得到數(shù)組的起始地址,可通過(guò)數(shù)組類(lèi)型定義數(shù)組指針:ArrayType* pointer;也可以直接定義:type(*pointer)[n];其中 pointer 為數(shù)組指針變量名,type 為指向的數(shù)組的元素類(lèi)型,n 為指向的數(shù)組的大小。

        我們下來(lái)通過(guò)示例代碼進(jìn)行分析,代碼如下

#include <stdio.h>

typedef int(AINT5)[5];
typedef float(AFLOAT10)[10];
typedef char(ACHAR9)[9];

int main()
{
    AINT5 a1;
    float fArray[10];
    AFLOAT10* pf = &fArray;
    ACHAR9 cArray;
    
    char(*pc)[9] = &cArray;
    char(*pcw)[4] = cArray;
    
    int i = 0;
    
    printf("%d, %d\n", sizeof(AINT5), sizeof(a1));
    
    for(i=0; i<10; i++)
    {
        (*pf)[i] = i;
    }
    
    for(i=0; i<10; i++)
    {
        printf("%f\n", fArray[i]);
    }
    
    printf("%p, %p, %p\n", &cArray, pc+1, pcw+1);
    
    return 0;
}

        我們來(lái)分析下這個(gè)代碼,在3-5行定義了三種類(lèi)型的數(shù)組,在第14行定義了一個(gè)類(lèi)型為 char[9] 的指針并將它指向 cArray,因?yàn)?cArray 的類(lèi)型也是 char[9],所以這句不會(huì)出錯(cuò)。在第10行定義了一個(gè)類(lèi)型為 char[4] 的指針,但用 cArry 初始化它,這就會(huì)出問(wèn)題。因?yàn)轭?lèi)型不同,所以會(huì)報(bào)錯(cuò)。在第23行,pf是指向數(shù)組 fArray 的指針,在這塊加 * 號(hào)相當(dāng)于取數(shù)組中的值,那么這句的意思就是給數(shù)組 fArray 賦值。在第31行,打印的第一個(gè)是數(shù)組 cArray 的地址,pc + 1相當(dāng)于指針運(yùn)算,也就是 (unsigned int)pc + sizeof(*pc) ==> (unsigned int)pc + 1 * 9; pcw + 1 ==> (unsigend int)pcw + sizeof(pcw) ==> (unsigned int)pcw + 1 * 4;我們來(lái)看看編譯結(jié)果

C之?dāng)?shù)組指針和指針數(shù)組(二十九)

        我們看到程序在第15行只是報(bào)了個(gè)警告,最后三行的結(jié)果卻是如我們所分析的那樣。我們作為專(zhuān)業(yè)的程序猿,必須將每個(gè)警告都當(dāng)成錯(cuò)誤處理,因?yàn)榫嬉簿鸵馕吨绦虻倪\(yùn)行可能不正常,誰(shuí)也不知道會(huì)發(fā)生啥事。

        我們下來(lái)再來(lái)講講指針數(shù)組,其實(shí)指針數(shù)組是一個(gè)普通的數(shù)組,它里面的每個(gè)元素為一個(gè)指針。指針數(shù)組的定義:type* pArray[n];其中 type* 為數(shù)組中每個(gè)元素的類(lèi)型,pArray 為數(shù)組名,n 為數(shù)組大小。

        下來(lái)我們以示例代碼進(jìn)行分析,代碼如下

#include <stdio.h>
#include <string.h>

#define DIM(a) (sizeof(a)/sizeof(*a))

int lookup_keyword(const char* key, const char* table[], const int size)
{
    int ret = -1;
    
    int i = 0;
    
    for(i=0; i<size; i++)
    {
        if( strcmp(key, table[i]) == 0 )
        {
            ret = i;
            break;
        }
    }
    
    return ret;
}

int main()
{
    const char* keyword[] = {
            "do",
            "for",
            "if",
            "register",
            "return",
            "switch",
            "while",
            "case",
            "static"
    };
    
    printf("%d\n", lookup_keyword("return", keyword, DIM(keyword)));
    printf("%d\n", lookup_keyword("main", keyword, DIM(keyword)));
    
    return 0;
}

        我們這個(gè)函數(shù)的功能很簡(jiǎn)單,就是在一個(gè)指針數(shù)組中查找字符串,如果找到便返回它的編號(hào)。如果沒(méi)找到便返回 -1,我們看看編譯結(jié)果

C之?dāng)?shù)組指針和指針數(shù)組(二十九)

        我們看到函數(shù)確實(shí)實(shí)現(xiàn)了這個(gè)功能。通過(guò)對(duì)數(shù)組指針和指針數(shù)組的學(xué)習(xí),我們總結(jié)如下:1、數(shù)組的類(lèi)型由元素類(lèi)型和數(shù)組大小共同決定;2、數(shù)組指針是一個(gè)指針,指向?qū)?yīng)類(lèi)型的數(shù)組;指針數(shù)組是一個(gè)數(shù)組,其中每個(gè)元素都為指針;3、數(shù)組指針遵循指針運(yùn)算法則,指針數(shù)組擁有 C 語(yǔ)言數(shù)組的各種特性。


        歡迎大家一起來(lái)學(xué)習(xí) C 語(yǔ)言,可以加我QQ:243343083。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI