基本概念
1.%p是地址的转义字符
2.地址值是用十六进制的无符号整数表示的,其字长一般与主机的字长相同。
3.int * pa:pa是一个指针变量,它指向一个整形变量(*是指针类型说明符)。
4.习惯上在定义指针变量的同时将其初始化为NULL,未被初始化意味着它的值是一个随机值,无法预知它指向哪里,会给系统带来潜在危险。
5.间接寻址时,*为间接寻址运算符,用来访问指针变量所指向的变量的值。
6.按值调用:不能在被调函数中改变其调用与剧中的实参值。
7.模拟按引用调用:运用指针为形参,通过向被调函数形参传递某个变量的地址值,可以在被调函数中改变主调函数中这个变量的值(需要返回多个值时,运用此方法)。
8.出口参数:值在函数调用结束后才被确定。
9.入口参数:在函数调用前,必须确定其值的形参。
10.函数的入口地址:存储函数第一条指令的地址,不带()的函数名。
11.函数指针:存储函数在内存中的入口地址。
函数指针和返回指针函数的区别
int (* compare)(int a,int b)
compare -> * -> () -> int
compare是一个指针变量,该指针变量可以指向一个有两个整形形参,返回值为整型的函数。
int * compare (int a,int b)
compare -> () -> * -> int
compare是一个函数,它有两个整型形参,返回一个整型指针。
函数指针例
void AscendingSort (int a[],int n)
{
int i,j,k;
for (i = 0; i < n-1; i++)
{
k = i;
for (j = i+1;j < n; j++)
if (a[j] < a[k])
k = j;
if (k != i)
Swap(&a[k],&a[i]);
}
}
void DescendingSort (int a[],int n)
{
int i,j,k;
for (i = 0; i < n-1; i++)
{
k = i;
for (j = i+1;j < n; j++)
if (a[j] > a[k])
k = j;
if (k != i)
Swap(&a[k],&a[i]);
}
}
由上述代码可知,除了if语句中的条件不同,两函数其他语句均相同。
添加一个函数指针int (* compare)(int a,intb),得到以下代码:
void SelectionSort (int a[],int n,int (* compare)(int a,int b))
{
int i,j,k;
for (i = 0; i < n-1; i++)
{
k = i;
for (j = i+1;j < n; j++)
if ((* compare)(a[j],a[k])) //利用函数指针实现升序降序选择
k = j;
if (k != i)
Swap(&a[k],&a[i]);
}
}
int Ascending (int a,int b)
{
return a < b;
}
int Descending (int a,int b)
{
return a > b;
}
调用SelectionSort函数时,将升降序函数名(入口地址)传递给函数指针形参变量。如下:
SelectionSort (score,n,Ascending) ;
SelectionSort (score,n,Descending) ;
第二段代码中,if ((* compare)(a[j],a[k]))可以替换为if(compare(a[j],a[k])),它们意义相同,不过第一种表达方式更直观。