指針

  • 從0到1,迴歸基礎,夯實基礎 ,點滴積累,成就未來
#include <stdio.h>
#include <stdlib.h>

int main1()//定義函數的指針變量
{
    void fun(int x, int y, int(*p)(int, int));
    int max2(int , int );
    int min2(int , int );
    int add2(int, int);

    int a = 21, b = -9, n;

    printf("choose 1,2 or 3:\n");
    scanf_s("%d", &n);

    if (n == 1)
        fun(a, b, max2);

    else if (n == 2)
        fun(a, b, min2);
    else if (n == 3)
        fun(a, b, add2);



}
void fun(int x, int y, int(*p)(int, int))
{
    int result;
    result = (*p)(x, y);
    printf("%d\n", result);
}
int max2(int x, int y)
{
    return x > y ? x : y;
}
int min2(int x, int y)
{
    return x < y ? x : y;
}
int add2(int x, int y)
{
    return (x + y);
}


//函數返回指針

int main2()
{
    float score[][4] = { { 60, 70, 80, 90 }, { 56, 89, 67, 88 }, { 34, 78, 90, 66 } };
    float *search(float(* pointer)[4], int n);
    float *p;
    int i, k;
    printf("enter the number of stdudent:\n");
    scanf_s("%d", &k);
    p = search(score, k);//返回score[k][0]的地址
    for (i = 0; i < 4; i++)
        printf("%5.2f\t", *(p + i));//輸出score[k][0]-score[k][3]
    printf("\n");


}
float *search(float(*pointer)[4], int n)//返回score[k][0]的地址
{
    float *pt;
    pt = *(pointer + n);//&score[k][0]
    return pt;
}

int main3()
{
    float score[][4] = { { 60, 70, 80, 90 }, { 56, 89, 67, 88 }, { 34, 78, 90, 66 } };
    float *search_score(float(*pointer)[4]);
    float *p;
    int i, j;
    for (int i = 0; i < 3; i++)
    {
        p = search_score(score + i);//調用search函數,如果不及格返回score[i][0]的地址,否則返回NULL

        if (p == *(score+i))//如果返回的是score[i][0]的地址,表示p的值不是NULL;
        {
            printf("No.%d socre;", i);
            for (int j = 0; j < 4; j++)
            {
                printf("%5.2f ", *(p + j));//輸出p[i][0]-p[i][j];
            }
            printf("\n");
        }
    }


}

float *search_score(float(*pointer)[4])
{
    int i = 0;
    float *pt;
    pt = NULL;
    for (; i < 4; i++)
        if (*(*pointer + i) < 60)
            pt = *pointer;//如果有不及格課程,使pt指向score[i][]
    return pt;
}
int main4()//指針數組
{
    void sort(char *name[], int n);
    void print(char *name[], int n);
    char *name[] = { "Follow me", "BASIC", "Great Wall", "FORTRAN", "Computer design" };
    int n = 5;
    sort(name, n);
    print(name, n);

    system("pause");
    return 0;
}
void sort(char *name[], int n)
{
    char *temp ;
    temp = name[0];
    int i, j, k;
    for (i = 0; i < n - 1; i++)
    {
        k = i;
        for (j = i+1; j < n; j++)           //選擇排序法,下面沒有大括號!!!!
            if (strcmp(name[k], name[j])>0)//字符串比較用strcmp
                k = j;
            if (k != i)
            {
                temp = name[i];
                name[i] = name[k];
                name[k] = temp;
            }

    }
}

void print(char *name[], int n)
{
    int i=0;
    char *p = name[0];
    while (i<n)
    {
        p = *(name + i++);
        printf("%s\n", p);
    }

}
int main5()//多重指針
{
    char *name[] = { "Follow me", "BASIC", "Great Wall", "FORTRAN", "Computer design" };
    char **p;
    int i;
    for (int i = 0; i < 5; i++)
    {
        p = name + i;
        printf("%s\n", *p);
    }

}
int main()//動態分配內存
{
    void checkp(int *p);
    int *p1, i;
    p1 = (int *)malloc(5 * sizeof(int));
    for (i = 0; i < 5; i++)
        scanf_s("%d", p1 + i);
    checkp(p1);
    free(p1);
    system("pause");
    return 0;
}

void checkp(int *p)
{
    int i;
    for (i = 0; i < 5; i++)
        if (*(p+i) < 60)
            printf("%d ", *(p+i));
    printf("\n");
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章