C++程序设计:通过指针调用函数详解

需积分: 15 1 下载量 52 浏览量 更新于2024-08-24 收藏 8.66MB PPT 举报
"C++³ÌÐòÉè¼Æ¡ª¡ªÌ·ºÆÇ¿" 在C++编程中,使用指向函数的指针变量调用函数是一种强大的技巧,它可以增强代码的灵活性和可扩展性。下面我们将深入探讨这个主题。 首先,我们需要了解函数指针的基本概念。在C++中,函数可以被视为一个对象,因此,可以有一个指针变量指向该函数。函数指针变量可以存储函数的地址,这样我们就可以通过这个指针来调用相应的函数。 在提供的代码示例中,有两个定义名为`max`的函数,它们的作用是返回两个整数中的较大值。第一个简单的例子展示了如何直接调用`max`函数: ```cpp int max(int x, int y) { return x > y ? x : y; } void main(void) { int a, b, c; cin >> a >> b; c = max(a, b); cout << c << endl; } ``` 在这个例子中,`main`函数直接调用了`max`函数,通过传递`a`和`b`的值,然后将结果存储在`c`中。 第二个例子引入了函数指针的概念: ```cpp int max(int x, int y) { return x > y ? x : y; } void main(void) { int a, b, c; int (*p)(int, int); // 定义一个指向函数的指针变量 p = max; // 给指针变量赋值,使其指向max函数 cin >> a >> b; c = p(a, b); // 通过指针变量调用函数 cout << c << endl; } ``` 在这个版本的`main`函数中,我们首先定义了一个函数指针变量`p`,类型为`int (*)(int, int)`,表示它指向一个接受两个整数参数并返回整数的函数。接着,我们用`p = max;`将`max`函数的地址赋值给`p`。最后,通过`p(a, b)`来调用`max`函数,这实际上相当于执行`c = max(a, b);`。 这种使用函数指针的方式有以下几个关键点: 1. **定义函数指针**:定义一个函数指针变量需要指定它指向的函数类型,包括返回值类型和参数列表。 2. **赋值给函数指针**:将函数名赋值给函数指针变量,实质上是将函数的地址存入指针变量。 3. **通过函数指针调用**:使用函数指针调用函数时,语法形式为`(*pointer)(arguments)`,其中`*pointer`是解引用操作,恢复成函数地址,`(arguments)`是传递给函数的参数。 这种机制在C++中有很多实际应用,例如回调函数、动态调度、算法实现(如排序)等。它允许我们在运行时决定调用哪个函数,增强了程序的动态性和模块化。 C++的另一个重要特性是它的面向对象编程(OOP)支持,包括类、对象、封装、继承和多态。这些特性使得C++在软件开发中广泛应用,特别是在系统软件、游戏开发、嵌入式系统以及大型应用程序的构建中。 C++语言的发展源自C语言,C++在C的基础上增加了类、模板、异常处理、命名空间等特性,使其成为一个更强大、更现代的编程语言。C++的简洁性、高效性和可移植性使其在程序员中备受青睐,尽管它对初学者来说可能较为复杂,但掌握它能够极大地提升编程能力。
2023-07-08 上传

int main(void) { const unsigned char *point; u16 i=0; delay_init(); //ÑÓʱº¯Êý³õʼ»¯ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//ÉèÖÃÖжÏÓÅÏȼ¶·Ö×éΪ×é2£º2λÇÀÕ¼ÓÅÏȼ¶£¬2λÏìÓ¦ÓÅÏȼ¶ // uart_init(115200); //´®¿Ú³õʼ»¯Îª115200 LED_Init(); //³õʼ»¯ÓëLEDÁ¬½ÓµÄÓ²¼þ½Ó¿Ú // KEY_Init(); //°´¼ü³õʼ»¯ AT24CXX_Init(); //IIC³õʼ»¯ OLED_init(); point= &picture_tab[0]; TIM_OCInitTypeDef TIM_OCInitStructure; delay_init(); //ÑÓʱº¯Êý³õʼ»¯ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //ÉèÖÃNVICÖжϷÖ×é2:2λÇÀÕ¼ÓÅÏȼ¶£¬2λÏìÓ¦ÓÅÏȼ¶ uart_init(115200); //´®¿Ú³õʼ»¯Îª115200 LED_Init(); //LED¶Ë¿Ú³õʼ»¯ TIM3_Int_Init(4999,7199);//10KhzµÄ¼ÆÊýƵÂÊ£¬¼ÆÊýµ½5000Ϊ500ms TIM4_PWM_Init(10000-1,72-1); //72M/72=1MHz¼ÆÊýƵÂÊ,ÖØ×°ÔØÖµ while(1) { OLED_ShowString(0,30,"21221054",16); OLED_ShowString(0,15,"2023/5/18",16); OLED_ShowChinese(0,0,0,16,1); OLED_ShowChinese(16,0,1,16,1); OLED_ShowChinese(32,0,2,16,1); delay_ms(1000); OLED_Refresh_Gram(); //¸üÐÂÏÔʾµ½OLED if(++i > 3) { LED1=!LED1;//ÌáʾϵͳÕýÔÚÔËÐÐ i=0; } while(1) { u16 u16tmp; u16tmp += 500; if(u16tmp > 10000) u16tmp=0; //³õʼ»¯TIM4 Channe3 PWMģʽ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //Ñ¡Ôñ¶¨Ê±Æ÷ģʽ:TIMÂö³å¿í¶Èµ÷ÖÆģʽ2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±È½ÏÊä³öʹÄÜ TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //Êä³ö¼«ÐÔ:TIMÊä³ö±È½Ï¼«ÐÔ¸ß TIM_OCInitStructure.TIM_Pulse = u16tmp; TIM_OC3Init(TIM4, &TIM_OCInitStructure); //¸ù¾ÝTÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèTIM4 OC3 LED2=!LED2; //LED3=!LED3; delay_ms(300); } } }这段代码问题如下:declaration may not appear after executable statement inblock,TIM OCINITTYPEDEF TIM OCINITSTRUCTURE,请修改这个问题

2023-06-09 上传