您的位置:首页 > 其它

数组指针和指针数组

2020-12-31 22:15 1321 查看

数组指针

本质是指针,指向数组。数组也是有类型的,其类型由元素类型元素个数共同来决定。因此,

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)

最后,需要注意的是,数组首元素的起始地址数组的的起始地址不是同一个概念。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: