第32课 数组指针和指针数组分析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第32课 数组指针和指针数组分析相关的知识,希望对你有一定的参考价值。

1. 数组的类型

(1)C语言中的数组有自己特定的类型

(2)数组的类型由元素类型数组大小共同决定。(如int array[5]类型为int[5]

2. 定义数组类型

(1)C语言中通过typedef为数组类型重命名:typedef type(name)[size];

  ①数组类型:如typedef int (AINT5)[5]; typedef float (AFLOAT10)[10];

  ②数组定义:AINT5 iArray; AFLOAT10 fArray;

3. 数组指针

(1)数组指针用于指向一个数组

(2)数组名是数组首元素的起始地址,但并不是数组的起始地址。

(3)通过将&作用于数组名可以得到数组的起始地址

(4)定义数组指针的两种方式:

  ①可通过数组类型定义数组指针:ArrayType* pointer;

  ②可以直接定义:type (*pointer)[n]; //其中pointer为数组指针变量名,type为数组的元素类型n为数组的大小

【实例分析】数组类型与数组指针

#include <stdio.h>

typedef int (AINT5)[5];       //数组类型:int[5]
typedef float (AFLOAT10)[10]; //数组类型:float[10]
typedef char (ACHAR9)[9];     //数组类型:char[9]

int main(){
   
    AINT5 a1;  //定义变量a1为int[5]类型的数组
    float fArray[10];//普通定义数组的方法
    AFLOAT10* pf = &fArray;//合法。&表示取的是整个数组地址(相当于
                           //float[10]类型的数组指针。
    ACHAR9 cArray;
    
    char(*pc)[9] = &cArray;//定义pc指针,并指向cArray数组。类型一致,合法。
    //char(*pcw)[4] = cArray;//错误,数组名cArray为首元素的地址(相当于char*)与pcw指针类型不匹配
    char(*pcw)[4] = (char(*)[4])cArray;

    int i = 0;
    
    printf("%d, %d\n", sizeof(AINT5),sizeof(a1));//4*5=20
    
    for(i=0; i<10; i++)
    {
        (*pf)[i] = (float)i; //pf指向整个数组,即相当于&a。而*pf等价于(*&a),即相当于a
                             //即*pf等价于数组名fArray,所以表达式相当于fArray[i] = (float)i;
    }

    printf("pf = %X, pf + 1 = %X\n", pf, pf+1); //pf + 1,指向数组最后一个元素的后面

    for(i=0; i<10; i++)
    {
        printf("%f\n",fArray[i]);//打印0到9
    }

    printf("%p, %p ,%p\n", &cArray, pc+1, pcw+1);//pc+1==>(unsigned int)pc + 1*sizeof(*pc)
                                                 //    ==>(unsigned int)pc + 1*9
                                                 //同理pcw + 1 = pcw + 4
    
    return 0;
}

4. 指针数组

(1)指针数组是一个普通的数组,其中的每个元素为一个指针

(2)指针数组的定义:type* pArray[n];//其中的type*为数组中元素的类型,pArray为数组名,n为数组的大小(如float* a[3])

【实例分析】指针数组的应用

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

//sizeof(a)表示整个元素的大小
//a表示首元素地址,*a即取出第1个元素
#define DIM(a) (sizeof(a)/sizeof(*a))

//table指向一个指针数组,即每个元素为指针类型
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)));//4
    printf("%d\n", lookup_keyword("main",keyword,DIM(keyword))); //-1

    return 0;
}

5. 小结

(1)数组的类型由元素类型数组大小共同决定

(2)数组指针是一个指针,指向对应类型的数组。

(3)指针数组是一个数组,其中每个元素都为指针

(4)数组指针遵循指针运算法则

(5)指针数组拥有C语言数组的各种特性

 

以上是关于第32课 数组指针和指针数组分析的主要内容,如果未能解决你的问题,请参考以下文章

第34课 多维数组和多维指针

第35课 数组参数和指针参数分析

第28课 指针和数组分析(上)

第29课 指针和数组分析(下)

第37课 指针阅读技巧分析

数组与指针分析