函数指针以及位运算

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

使用方法
#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;
}



例子:
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; // “* elem1” 非法
p2 = (unsigned int *) elem2; // “* 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;
}


2.位运算

用于对整数类型(int,char, long 等)变量中的某一位(bit), 或者若干位进行操作。

按位与 “&”
将参与运算的两操作数各对应的二进制位进行与 操作,只有对应的两个二进位均为1时,结果的对 应二进制位才为1,否则为0。


按位或 “|”
将参与运算的两操作数各对应的二进制位进行或操 作,只有对应的两个二进位都为0时,结果的对应 二进制位才是0,否则为1。

按位异或 “^”
将参与运算的两操作数各对应的二进制位进行异或操作, 即只有对应的两个二进位不相同时,结果的对应二进制 位才是1,否则为0。

按位非 “~”
按位非运算符“~”是单目运算符。
其功能是将操作数中的二进制位0变成1,1变成0。

左移运算符 “<<”
表达式:
a << b 的值是:将a各二进位全部左移b位后得到的值。左移时,高位 丢弃,低位补0。a 的值不因运算而改变。

右移运算符 “>>”
表达式:
a >> b 的值是:将a各二进位全部右移b位后得到的值。右移时,移出最右边 的位就被丢弃。 a 的值不因运算而改变。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值