数组指针
本质是指针,指向数组。数组也是有类型的,其类型由元素类型和元素个数共同来决定。因此,
int array[5] = {1, 2, 3, 4, 5};
int (*pArray) [5] = &array;
pArray是一个指针,指向一个具有5个元素,且元素类型为int的array数组。
另外,为了简化写法,C语言还支持使用typedef来为数组类型重命名。前面讲了,数组类型是由元素类型和元素个数共同决定。因此,使用typedef为数组类型重命名的方式如下,
typedef int (AINT5) [5];
typedef float (AFLOAT10) [10];
因此,这个时候,定义数组就变成了,
AINT5 iArray;
AFLOAT10 fArray;
由于有int类型的数据,因此可以定义一个int 的指针;由于有 loat类型的数据,因此可以定义一个float 的指针。现在已经通过typdef为数组类型重命名了,也就是说,获得了数组类型,那么可以定义一个数组指针。
AINT5* pArray = &iArray;
因此,* pArray取得的就是它实际指向的目标iArray。因此,以下两种写法是等价的,
(*pArray)[i] 等价于 iArray[i]
实例代码
typedef float (AFLOAT10) [10];
AFLOAT10 fArray = {1, 2, 3, 4, 5, 6, 7, 8, 9 ,10};
AFLOAT10* pf = &fArray;
int i = 0;
for(i = 0; i < 10; ++i){
printf("%f\n", fArray[i]);
}
i = 0;
for(i = 0; i < 10; ++i){
printf("%f\n", (*pf)[i]);
}
指针数组
本质是数组,其数组元素为指针。一个char* 指针可以指向一个字符串,那么我有了指针数组后,就可以指向我所需要指向的任意多个字符串。
const char* keyWord[] = {
"do",
"for",
"if",
"register",
"switch"
};
因此,我可以借此实现一个查找关键字功能的函数。
int lookup_keyWord(const char* key, const char* table[], const int size){
int ret = -1;
for(int i = 0; i < size; ++i){
if(strcmp(key, table[i]) == 0){
ret = i;
break;
}
}
return ret;
}
这段代码中,函数定义中提供了size变量,那是因为在函数中table会退化成const char** table,因此会丢失数组元素个数信息,因此需要提供一个size信息。那么size怎么得到呢?可以通过定义一个宏,
#defin DIM(arr) sizeof(arr) / sizeof(*arr)
最后,需要注意的是,数组首元素的起始地址与数组的的起始地址不是同一个概念。
Ctrl+Enter 发布
发布
取消