第一周 从C走进C++ 001 函数指针

1. 基本概念:

  程序运行期间,每个函数都会占用一段连续的内存空间。而函数名就是该函数所占内存区域的起始地址(也称“入口地址”)。我们可以将函数的入口地址赋给一个指针变量,使该指针变量指向该函数。然后通过指针变量就可以调用这个函数。这种指向函数的指针变量称为“函数指针”。

                                  

2. 定义形式
  类型名 (* 指针变量名)(参数类型1, 参数类型2,…);

  例如:
    int (*pf)(int ,char);
表示pf是一个函数指针,它所指向的函数,返回值类型应是int,该函数应有两个参数,第一个是int 类型,第二个是char类型。

3. 使用方法
  可以用一个原型匹配的函数的名字给一个函数指针赋值。
  要通过函数指针调用它所指向的函数,写法为:
    函数指针名(实参表);

#include <stdio.h>
void PrintMin(int a,int b)  {
  if( a<b )
      printf("%d",a);
  else
      printf("%d",b);
}
int main() {
    void (* pf)(int ,int);
    int x = 4, y = 5;
    pf = PrintMin;
    pf(x,y);
    return 0;
} 

4. 函数指针和qsort库函数
  C语言快速排序库函数:
    void qsort(void *base, int nelem, unsigned int width, int ( * pfCompare)( const void *, const void *));
可以对任意类型的数组进行排序。

                

  实例:

    下面的程序,功能是调用qsort库函数,将一个unsigned int数组按照个位数从小到大进行排序。比如 8,23,15三个数,按个位数从小到大排序,就应该是 23,15,8 。

#include <stdio.h>
#include <stdlib.h>
int MyCompare( const void * elem1, const void * elem2 )
{
  unsigned int * p1, * p2;
  p1 = (unsigned int *) elem1;
  p2 = (unsigned int *) elem2;
  return  (* p1 % 10)  - (* p2 % 10 );
}
#define NUM 5
int main()
{
  unsigned int an[NUM] = { 8,123,11,10,4 };
  qsort( an,NUM,sizeof(unsigned int), MyCompare);
  for( int i = 0;i < NUM; i ++ )
    printf("%d ",an[i]);
  return 0;
} 

第一周 从C走进C++ 001 函数指针,布布扣,bubuko.com

时间: 2024-10-24 00:17:34

第一周 从C走进C++ 001 函数指针的相关文章

第一周 从C走进C++ 008 函数缺省参数

1. 函数的缺省参数? C++中,定义函数的时候可以让最右边的连续若干个参数有缺省值,那么调用函数的时候,若相应位置不写参数,参数就是缺省值. void func( int x1, int x2 = 2, int x3 = 3) { } func(10 ) ; //等效于func(10,2,3) func(10,8) ; //等效于func(10,8,3) func(10, , 8) ; //不行,只能最右边的连续若干个参数缺省 ? 函数参数可缺省的目的在于提高程序的可扩充性.? 即如果某个写好

第一周 从C走进C++ 007 内联函数和重载函数

1. 内联函数? 函数调用是有时间开销的.如果函数本身只有几条语句,执行非常快,而且函数被反复执行很多次,相比之下调用函数所产生的这个开销就会显得比较大.? 为了减少函数调用的开销,引入了内联函数机制.编译器处理对内联函数的调用语句时,是将整个函数的代码插入到调用语句处,而不会产生调用函数的语句. inline int Max(int a,int b) { if( a > b) return a; return b; } 2. 函数重载? 一个或多个函数,名字相同,然而参数个数或参数类型不相同,

第一周 从C走进C++ 004 引用

1. 引用的概念 下面的写法定义了一个引用,并将其初始化为引用某个变量. 类型名 & 引用名 = 某变量名; int n = 4; int & r = n; // r引用了 n, r的类型是 int &  某个变量的引用,等价于这个变量,相当于该变量的一个别名. int n = 4; int & r = n; r = 4; cout << r; //输出4 cout << n; //输出4 n = 5; cout << r; //输出5

第一周 从C走进C++ 005 const

1.  定义常量 const int MAX_VAL = 23; const string NAME = "Micael Jordan"; 2. 定义常量指针 不可通过常量指针修改其指向的内容 int n,m; const int * p = & n; * p = 5; //编译出错 n = 4; //ok p = &m; //ok, 常量指针的指向可以变化 不能把常量指针赋值给非常量指针,反过来可以 const int * p1; int * p2; p1 = p2;

第一周 从C走进C++ 003 位运算

1. 基本概念 位运算: 用于对整数类型(int,char, long 等)变量中的 某一位(bit),或者若干位进行操作. 比如: 1) 判断某一位是否为1 2) 只改变其中某一位,而保持其他位都不变. C/C++语言提供了六种位运算符来进行位运算操作: &   按位与(双目) |    按位或(双目) ^   按位异或(双目) ~   按位非(取反)(单目) << 左移(双目) >> 右移(双目) 2. 按位与 “&” 将参与运算的两操作数各对应的二进制位进行与

第一周 从C走进C++ 002 命令行参数

1. 命令行参数 int main(int argc, char * argv[]) { …… } argc: 代表启动程序时,命令行参数的个数.C/C++语言规定,可执行程序程序本身的文件名,也算一个命令行参数,因此,argc的值至少是1. argv: 指针数组,其中的每个元素都是一个char* 类型的指针,该指针指向一个字符串,这个字符串里就存放着命令行参数. 例如,argv[0]指向的字符串就是第一个命令行参数,即可执行程序的文件名,argv[1]指向第二个命令行参数,argv[2]指向第

第一周 从C走进C++ 006 动态内存分配

1. 用new 运算符实现动态内存分配 第一种用法,分配一个变量: P = new T; T是任意类型名,P是类型为T * 的指针. 动态分配出一片大小为 sizeof(T)字节的内存空间,并且将该内存空间的起始地址赋值给P.比如: int * pn; pn = new int; * pn = 5; 第二种用法,分配一个数组: P = new T[N]; T :任意类型名 P :类型为T * 的指针 N :要分配的数组元素的个数,可以是整型表达式 动态分配出一片大小为 sizeof(T)字节的内

机器学习001 deeplearning.ai 深度学习课程 Neural Networks and Deep Learning 第一周总结

Deep Learning Specialization 吴恩达老师最近在coursera上联合deeplearning.ai 推出了有关深度学习的一系列课程,相对于之前的machine learning课程,这次的课程更加实用,作业语言也有matlab改为了python从而更加贴合目前的趋势.在此将对这个系列课程做一个学习笔记. 而这次的Deep Learning Specialization分为五门课程,分别为:Neural Networks and Deep Learning,Improv

学习Linux第一周所有命令总结

一周总结 开学第一周,总结这周所学知识点 以命令首字母顺序整理 alias 用来设置指令的别名 alias命令的作用只局限于该次登入的操作. 若要每次登入都能够使用这些命令别名,则可将相应的alias命令存放到bash的初始化文件/etc/bashrc中. 或者存放在用户家目录的.bashrc中 用法 alias 新的命令='原命令 -选项/参数' unalias 别名 (删除别名) unalias -a 别名 (删除全部别名) 编辑家目录下配置文件(只在当前用户生效) vim ~/.bashr