一级指针
比如:
//字符指针
char ch = 'w';
char *p = &ch;
//字符串指针
char * str = "hello."; // str指向h的地址;
二级指针
指向指针的指针,二级指针又分为指向指针变量的指针和指向数组的指针。
比如:
char ch = 'w';
char *p = &ch;
char**pp = &p;
指针数组
数组中的所有元素保存的都是指针
比如:
int a = 1, b = 2, c = 3;
int *arr[] = {&a, &b, &c}; //[ ]的优先级高于*,该定义形式应该理解为:int *(arr[])
数组指针
指向数组的指针
比如:
int (*p)[10];
指针和数组
char str1[] = "hello bit.";
char str2[] = "hello bit.";
char *str3 = "hello bit.";
char *str4 = "hello bit.";
str1 != str2;str3 = str4;
函数指针
存放函数的地址
void (*pfun)();
pfun先和*结合,说明pfun是指针,指针指向的是一个函数,指向的函数无参数,返回值 类型为void。
函数指针数组
函数的地址存到一个数组中,那这个数组就叫函数指针数组
int (*parr[10]])();
parr 先和 [] 结合,说明parr是数组,数组的内容是什么呢? 是 int (* )() 类型的函数指针。
函数指针数组的用途:转移表
例
#include <stdio.h>
int add(int a, int b) { return a + b; }
int sub(int a, int b) {return a - b; }
int mul(int a, int b) {return a*b; }
int div(int a, int b) {return a / b; }
int main() {
int x, y;
int input = 1;
int ret = 0;
int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; //转移表
while (input)
{
printf( " 1:add 2:sub \n" );
printf( " 3:mul 4:div \n" );
printf( "请选择:" );
scanf( "%d", &input);
if ((input <= 4 && input >= 1))
{
printf( "输入操作数:" );
scanf( "%d %d", &x, &y);
ret = (*p[input])(x, y);
}
else
printf( "输入有误\n" );
printf( "ret = %d\n", ret);
}
return 0;
}
指向函数指针数组的指针
指向函数指针数组的指针是一个指针 指针指向一个数组,数组的元素都是函数指针;
void test(const char* str) { printf("%s\n", str); }
int main()
{
//函数指针
pfun void (*pfun)(const char*) = test;
//函数指针的数组pfunArr
void (*pfunArr[5])(const char* str);
pfunArr[0] = test;
//指向函数指针数组pfunArr的指针ppfunArr
void (*(*ppfunArr)[10])(const char*) = &pfunArr;
return 0;
}