数组指针与指针数是非常重要的概念。面试中也是经常会被问到的

1 数组的类型

C语言中的数组有自己特定的类型。比如 int a[5];

数组a的类型是 int[5],并不是 int类型。

  • 数组类型是由元素类型数组大小共同决定的

1.1 定义数组的类型

在C语言中可以通过typedef 为数组的类型重命名。如下:

  • 数组的类型:

  • 数组的定义:

这种写法可能有的人没见过,等看过后面的数组指针与指针数的定义的时候就知道了。

2 数组指针

  • 数组指针是一个指针,不是数组。这个指针指向一个数组。该指针需要使用取地址符 & 向数组取地址。(数组的整个地址而非数组元素首地址)
  • 可以通过数组类型来定义数组指针:ArrayType* pointer;
  • 也可以直接定义:type(*pointer)[n];

注意:上面的pointer为数组指针变量,ArrayType是数组的类型,type是数组里面元素的类型。注意区分三者的不同。

2.1 数组类型和数组指针的代码分析

分析下面的代码32-1.c:

#include <stdio.h>

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

int main(){
    
    AINT5 a1; //int a1[5];
    float fArray[10];
    
    AFLOAT10* pf = &fArray;  //注意与float* pf = &fArray 区分
    
    ACHAR9 cArray;
    
    char(*pc)[9] = &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\n", &cArray, pc+1);   //pc是整个数组的指针,pc+1 ==》&cArray + 9
    
    return 0;
}
  • 编译运行上述代码:

分析:

  • 注意学习上面定义数组类型的方法,并使用定义的数组类型来定义数组。
  • 注意数组指针的声明与使用方法
  • 数组指针是整个数组的地址,需要使用& 号来获取
  • 代码比较简单,不多做分析

3 指针数组

  • 指针数组是一个数组,不是指针。该数组存的元素是指针。
  • 指针数组的定义: type* pArray[n];

其中 type* 是数组中存的元素的类型pArray 是数组名。如下图的指针数组:

3.1 指针数组代码案例分析

  • 代码32-2.c
#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 i=0;
    for(i=0; i<size; i++){
        if(strcmp(key, table[i]) == 0){
            break;
        }
    }
    return i>=size?-1:i;
}
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;
}
  • 编译运行结果为:

4
-1

分析:

  • lookup_keyword这个函数是查找字符串数组中是否存在某一个字符串
  • table数组,就是一个指针数组,里面存的是指针。(字符串是一种常量指针)
  • 注意学会使用指针数组的使用。

4 总结

  • 数组也是有类型的:由数组的大小元素的类型共同决定的
  • 数组指针是一个指针,该指针指向对应类型的数组
  • 指针数组是一个数组,该数组中存的元素是对应类型的指针
  • 指针数组的使用与数组是一样的。但是注意指针数组在使用的时候是如何表示的。