数组指针与指针数是非常重要的概念。面试中也是经常会被问到的
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 总结
- 数组也是有类型的:由数组的大小和元素的类型共同决定的
- 数组指针是一个指针,该指针指向对应类型的数组
- 指针数组是一个数组,该数组中存的元素是对应类型的指针
- 指针数组的使用与数组是一样的。但是注意指针数组在使用的时候是如何表示的。