此处分析四种类型的指针:
1,指向单个地址的指针
int a = 12;
int *b = &a;//b中是a的地址,所以b指向a
int **c = &b;//c中是b的地址,b又指向a,所以c指向a
----------------------------------------------------------------------------------------------------------
2,指向数组的指针
int array[10];
int *ap = array;//ap是个地址,而且ap这中的值与array中的值相同
int *ai = array+2;
ap[3];
ai[-1];
-----------------------------------------------------------------------------------------------------------
3,指向二维数组的指针
(1)
int matrix[3][10];
int *p = &matrix[0][0];
int *p = matrix[0];
int **p = matrix;
以上是逐个访问而不是逐行在数组中移动;
增加这个指针的值使他指向下一个整形元素。
(2)
int (*p)[10] = matrix;//注意:有括号,不推荐
P是一个指向拥有10个整形数组的指针,p指向数组的第一行,p+1指向数组的第二行,以此类推。
-----------------------------------------------------------------------------------------------------------
4,指针数组
int *api[10];
首先 [] 的优先级大于 * ,先取下标,说明api是个数组;
其次对api[i]间接引用,说明api中存的是地址
综上推出api是个指针数组。
注意跟int (*p)[10]不一样。
指针数组的一个小例子:
功能:遍历整个关键字列表,查找是否存在与参数字符串相同的匹配。当他找到一个匹配时,函数就返回这个匹配在列表中的偏移量。
#include "stdio.h"
#include "string.h"
//*keyword[]指向整形的指针,keyword是一维数组
char const *keyword[] = {
"do",
"for",
"if",
"register",
"return",
"switch",
"while"
};
#define N_KEYWORD (sizeof(keyword))/(sizeof(keyword[0]))
int lookup_keyword(char const * desired_word,
char const *keyword_table[],int const size){
char const **kwp;
for(kwp = keyword_table;kwp<keyword_table+size;kwp++){
if(strcmp(desired_word,*kwp) == 0){
printf("yes\n");
return kwp - keyword_table;
}
}
return -1;
}
int main(){
int num = 0;
char a[] = "if";
num = lookup_keyword(a,keyword,N_KEYWORD);
printf("N_KEYWORD = %d\n",N_KEYWORD);
printf("%d",num);
getchar();
return 0;
}