C语言学习|指针(10.19)

基本概念

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])),它们意义相同,不过第一种表达方式更直观。

猜你喜欢

转载自blog.csdn.net/qq_42272723/article/details/83178714