指针进阶——函数指针、结构体指针

指针进阶——函数指针、结构体指针


文章目录

  • 指针进阶——函数指针、结构体指针
    • 函数指针
      • 1. 函数指针的数组
      • 2. 函数指针传参
      • 3. 指向函数指针数组的指针
    • 结构体
      • 1. 定义结构体类型
      • 2. 结构体数组指针


函数指针

函数指针指向的是函数的入口地址
add和&add 相同 都是取出函数的地址

int add(int x, int y)
{
    
}
int main()
{
    int (*p)(int, int) = &add;//p为指针
    int sum = (*p)(2, 3);
    int sum = p(2, 3);//也可以相当于p = add
}

1. 函数指针的数组

存放函数指针的数组

int (*p1)(int, int) = add;
int (*p0)(int, int) = sub;
int (*parr[2])(int, int) = {sub, add};

如何使用

适合在使用多个函数,函数的返回类型和参数类型相同的情况下

int add(int x, int y)
{
    return x + y;
}
int sub(int x, int y)
{
    return x - y;
}

int main()
{
    int (*p[2]) (int, int) = {0, add, sub};
    int a = (*p[1])(2,4)//计算加法 2 + 4
}

2. 函数指针传参

数据借用上面的例子

void function(int (*p)(int, int))
{
    printf("%d", (*p)(2,4));//计算加法
}

int main()
{
    function(add);//将参数传入,加法函数
}

3. 指向函数指针数组的指针

对比一下下列各个式子

int* p1[2];//指针数组,数组有2个元素,每个元素类型为int*
int(*p2)[2];//数组指针,指向的数组元素个数为2,每个元素类型为int
int*(*p3)[2];//数组指针,指向的数组元素个数为2,每个元素类型为int*
int (*p4[2])(int, int);
//函数指针数组,数组有2个元素,每个元素为函数指针
int (*(*p5)[2])(int, int) = &p4;
//函数指针,指向一个数组,数组有2个元素,每个元素为函数指针

结构体

1. 定义结构体类型

组合类型-创建自定义类型

struct Book//内部类型定义
{
    char name[30];
    float price;
    char id[20];
};//注意分号不能漏掉
void Print(struct Book* b)
{
    printf("书名:%s\n,(*b).name");
    //结构体指针 ->  成员名/x -> name与上面等价
    printf("价格:%f\n,(*b).price");
    printf("书名:%s\n,(*b).id");
}
int main()
{
    struct Book b1={"c语言",63.2f,"A1"};//内部成员初始化s
    
    printf("书名:%s\n,b1.name");
    printf("价格:%f\n,b1.price");
    printf("书名:%s\n,b1.id");//结构题变量.成员名

}
//简单访问其中成员

给结构体指针设置为全局变量或局部变量

struct point
{
    int x;
    int y;
}b1, b2;//全局变量b1,b2

int main()
{
    struct point b;//局部变量b
}

给结构体重新命名

typedef struct Stu
{
    int x;
}mine;//重新命名stu 为 mine

int main()
{
    struct Stu a;//两个都可以使用
    mine b;
}

2. 结构体数组指针

struct menu//定义结构体类型变量内容
{
	int num;
	char name[10];//最多三个字的名字

};


void print_menu(struct menu *s, int sz)//打印menu
{
	int i = 0;

	for (i = 0; i < sz; i++)
	{
		printf("编号:%d\n", ((s + i)->num));
		printf("编号:%s\n", ((s + i)->name));
	}
}


void test_str()
{
	struct menu s[3] = { { 3,"zhang"},{4,"wang"},{2,"li"} };
	int sz = sizeof(s)/size0f(s[0])
	print_menu(s, sz);
}

	

你可能感兴趣的:(c,programing,language,c语言,c++)