指针数组、数组指针
-
指针数组。数组的元素类型是指针
如:int* a[4]
-
数组指针。指向数组的指针变量
如:int (*a)[4];
int main() {
int a[4] = {1, 2, 3, 4};
//指针数组
int *b[4];
//数组指针
int (*c)[4];
c = &a;
for (int i = 0; i < 4; i++) {
b[i] = &a[i];
}
printf("%d,%d", *b[1], c[0][1]);
}
定义了数组指针,该指针指向这个数组的首地址,必须给指针指定一个地址,容易犯的错得就是,不给b地址,直接用(b)[i]=c[i]给数组b中元素赋值,这时数组指针不知道指向哪里,调试时可能没错,但运行时肯定出现问题,使用指针时要注意这个问题。但为什么a就不用给他地址呢,a的元素是指针,实际上for循环内已经给数组a中元素指定地址了。但若在for循环内写a[i]=c[i],这同样会出问题。
指针函数、函数指针
-
指针函数 一个返回值为指针的函数,本质是一个函数。
//指针函数 char *reverse(char *); int main() { char s[100] = "abc"; char *res = reverse(s); if (res != NULL) printf("%s", res); } //字符串逆转,指针函数 char *reverse(char *p) { if (p == NULL) { return NULL; } int count = 0; char *k = p; while (*k++) { count++; } char *start = p; char *end = p + count - 1; for (int i = 0; i < count / 2; i++) { char temp = *start; *start = *end; *end = temp; start++; end--; } return p; }
-
函数指针 指向函数的指针变量,本质是一个指针。
将上面的代码进行一些修改,使用函数指针来执行。
int main() { char s[100] = "abc"; // char *res = reverse(s); // if (res != NULL) // printf("%s", res); // 声明函数指针 char *(*funcPointer)(char *); funcPointer = reverse; char *res = funcPointer(s); if (res != NULL) printf("%s", res); }