指針和數組


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


//定義:建立存儲空間的聲明稱爲定義;
//聲明:不需要建立存儲空間的聲明稱爲聲明;


//指針=地址;指針只能存放地址!!!例如:*p1=100 錯誤!可以 a=100; int *p1=&a;
//指針變量=存放(指針)地址的變量:包含存儲單元編號表示的地址和指向存儲單元的數據類型;

int main17()
{
    int a = 10, b = 20;
    int *p1, *p2;
    p1 = &a;
    p2 = &b;

    printf("a=%d,b=%d\n", a, b);
    printf("p1=%d,p2=%d\n", p1, p2);//地址
    printf("*p1=%d,*p2=%d\n", *p1, *p2);//

}
//指針
int main18()
{
    int *p, *p1, *p2, a, b;
    printf("input two integer number:\n");
    scanf_s("%d%d", &a, &b);
    p1 = &a;
    p2 = &b;
    if (*p1 < *p2)//地址互換
    {
        //p = p1;   p1 = p2;    p2 = p;
        p1 = &b;
        p2 = &a;
    }
    printf("a=%d.b=%d\n", a, b);
    printf("max=%d.min=%d\n", *p1, *p2);//輸出//a,c實際值不變,地址互換

}

int main19()
{
    void swap(int *p1, int *p2);
    int a, b;
    int *pp1, *pp2;
    printf("input two integer number:\n");
    scanf_s("%d%d", &a, &b);

    pp1 = &a;
    pp2 = &b;

    if (*pp1 < *pp2)//a,b的值改變
        swap(pp1, pp2);
    printf("max=%d.min=%d\n", a, b);//輸出


}

void swap(int *m1, int *m2)//將a,b的值改變
{
    int tmp;
    tmp = *m1;
    *m1 = *m2;
    *m2 = tmp;
}
void exchange(int *q1, int *q2, int *q3)
{
    void swap(int *m1, int *m2);
    if (*q1 < *q2) swap(q1, q2);
    if (*q1 < *q3) swap(q1, q3);
    if (*q2 < *q3) swap(q2, q3);

}

int main20()
{
    int *p1, *p2, *p3;
    int a, b, c;
    scanf_s("%d%d%d", &a, &b, &c);
    p1 = &a; p2 = &b; p3 = &c;
    exchange(p1, p2, p3);
    printf("the order is:%d,%d,%d\n", *p1, *p2, *p3);
    printf("the order is:%d,%d,%d\n", a, b, c);

}

int main21()
{
    int a[10];
    int *p;
    for (int i = 0; i < 10; i++)
        scanf_s("%d", a + i);

    //for (int i = 0; i <10; i++)
    //  printf("%d ", *(a + i));

    for (p=a; p < (a+10); p++)
        printf("%d\n", *p);

} 

int main22()
{
    void inv(int *arr, int n);
    int a[10];
    int *p=a;
    //輸入
    for (int i = 0; i < 10; i++, p++)
        scanf_s("%d", p);
    printf("\n");
    //輸出
    for (p=a ; p<(a+10); p++)//p必須重新指向a[0],因爲for循環已經是p指向a[9];
        printf("%d ", *p);
    p = a;
    inv(p, 10);

    printf("\n");
    for (p=a; p<(a + 10); p++)//同理
        printf("%d ", *p);


}

/*
void inv(int *arr, int n)
{
    int i, j, temp, m = (n - 1) / 2;
    for (i = 0; i <= m; i++)
    {
        j = n - 1 - i;
        temp = *(arr + i);                          //*(arr+i) = arr[i];
        *(arr + i) = *(arr + j);
        *(arr + j) = temp;
    }
}
*/
void inv(int *arr, int n)
{
    int *i, *j, temp, m = (n - 1) / 2;
    i = arr;
    j = arr + n - 1;
    for (; i <= (arr + m); i++, j--)
    {
        temp = *i; *i = *j; *j = temp;
    }
    return;
}
//快速排序
void qSort(int *a, int n)
{
    int i, j, k, t;
    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)
            {
                t = *(a + i);
                *(a + i) = *(a + k);
                *(a + k) = t;
            }

        }
    }

}

int main23()
{
    void qSort(int *a, int n);

    int i, b[10];
    int *p;
    p = b;
    for (i = 0; i < 10; i++)
        scanf_s("%d", p++);

    printf("\n");

//  for (p = b; p < (b + 10); p++)//一定要注意是p<(b+10);是b+10!!!如果不下心寫成p+10。。會一直打印。。且打印錯誤
//      printf("%d ", *p);
    for (p = b, i = 0; i < 10; i++, p++)
        printf("%d ", *p);

    printf("\n");
    p = b;
    qSort(p, 10);//如果直接調用qSort(b,10);結果會出錯。。。。why???

    for (p = b, i = 0; i < 10; i++)
    {
        printf("%d ", *p);
        p++;
    }
    printf("\n");

}
//二維數組

int main24()
{
    int a[3][4] = { 1, 3, 5, 6, 7, 8, 9, 19, 2, 4, 12, 11 };
    printf("%d,%d\n", a, *a);//0行首地址和0行0列首地址
    printf("%d,%d\n", a[0], *(a+0));//0行9列首地址
    printf("%d,%d\n", &a[0], &a[0][0]);//0行搜地址和0行0列首地址
    printf("%d,%d\n", &a[1], a + 1);//1行0列首地址和1行首地址
    printf("%d,%d\n", &a[1][0], *(a + 1)+0);//1行0列首地址
    printf("%d,%d\n", a[2], *(a + 2));//2行0列首地址
    printf("%d,%d\n", &a[2], a + 2);//2行首地址
    printf("%d,%d\n", a[1][0],*(*(a+1)+0));//1行0列元素的值//~~~!!!###%%^^^~~
    printf("%d,%d\n", a[2][0], *(*(a + 2)+0));//2行0列元素的值//~~~!!!###%%^^^~~

}
int main()
{
    int a[3][4] = { 1, 3, 5, 6, 7, 8, 9, 19, 2, 4, 12, 11 };
    int *p;
    for (p = a[0]; p < a[0] + 12; p++)//a[0]+12;與前面問題相同
    {
        if ((p - a[0]) % 4 == 0)
            printf("\n");
        printf("%4d", *p);
    }


    system("pause");
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章