文章目录[隐藏]

指针与数组

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define N 5
int main()
{
    //总结
    //&   取地址
    //*   根据地址取值
    //指针不可以赋常量值
    //一维数组里:score[i] => *(score[i] + i) => *(score + i)
    //二维数组里:score[i][j] => *(score[i] + j) => *(*(score + i) + j)

    //第六节
    //二维数组与指针
    //二维数组的理解:由n个以为数组所组成的
    int i, j;
    double score[5][3] = {
        {55, 66, 77},
        {25, 36, 47},
        {51, 67, 17},
        {15, 64, 87},
        {12, 56, 37}
    };
    //遍历第一行数组:第一行数组名就是score[0]
    for(i = 0; i < 5; i++)
    {
        for(j = 0; j < 3; j++)
        {
            printf("%.0lf\t", score[i][j]);
            //一维数组里:score[i] => *(score[i] + i) => *(score + i)
            //二维数组里:score[i][j] => *(score[i] + j) => *(*(score + i) + j)
        }
        printf("\n");
    }

    //第五节
    //数组逆序
    //原理:首位元素进行交换
    //公示  第i个元素和第N - i - 1个元素交换
    int array[] = {15, 20, 25, 30, 35};
    int temp;   //临时变量
    int i;
    int * ptr_array_statr = array;      //指向数组首元素的指针
    int * ptr_array_end = array + 4;    //指向数组尾元素的指针
    //指针交换思路
    //定义两个指针 ptr1 ptr2
    while(ptr_array_statr != ptr_array_end) //存在BUG只支持元素数量为单数的数组
    {
        //首尾交换,指针进行移动
        temp = *ptr_array_statr;
        *ptr_array_statr = *ptr_array_end;
        *ptr_array_end = temp;
        //首元素指针向后移动
        ptr_array_statr++;
        //尾元素指针向前移动
        ptr_array_end--;
    }

    //标准模式交换
    for(i = 0; i < N / 2; i++)
    {
        //交换:第i个值和第N-i-1个值向交换
        temp = array[i];
        array[i] = array[N - i - 1];
        array[N - i - 1] = temp;
    }
    for(i = 0; i < N; i++)
    {
        printf("%d\t", *(array + i));
    }
    //第四节
    int array[] = {15, 20, 25, 30, 35};
    int i;
    int * ptr_array = array;
    //赋值完毕后就可以使用指针访问数组元素
    for(i = 0; i < 5; i++)
    {
        //printf("第%d个元素的值为:%d\t地址为:%p\n", i + 1, array[i], &ptr_array[i]);
        //printf("第个%d元素的值为:%d\t地址为:%p\n", i + 1, *(ptr_array + i), ptr_array + i);
        printf("第%d个元素的值为:%d\t地址为:%p\n", i + 1, *ptr_array, ptr_array);
        ptr_array++;
        //每次循环都会移动指针的指向 要注意重置
    }
    //第三节
    //数组名就是数组的首地址等价于数组首元素地址
    int i;
    double score[] = {98,22,13,53,56};
    double * ptr_score = score;
    printf("double型数组的地址占%d个字节\n", sizeof(ptr_score));
    printf("数组的首地址:%p\t数组首元素的地址:%p\n", score,&score[0]);
    for(i = 0; i < ; i++)
    {
        //printf("%.2lf\n", ptr_score[i]);
        //printf("%.2lf\n", *(ptr_score + i));推荐,想要打印第几个元素就加几
        //printf("%.2lf\n", *ptr_score++);不推荐,因为他会改变指针指向
    }

    //第二节
    int num1 = 1024;
    int num2 = 2048;
    int * ptr1, * ptr2;
    ptr1 = &num1;
    ptr2 = &num2;
    printf("num1的值是:%d\tnum1的地址是:%p\n", num1, ptr1);
    printf("num2的值是:%d\tnum2的地址是:%p\n", num2, ptr2);
    //将变量1的值付给变量2
    //num2 = num1; 等价于 *ptr1 = *ptr2; 只改变变量不改变地址
    ptr2 = ptr1;
    printf("num1的值是:%d\tnum1的地址是:%p\n", num1, ptr1);
    printf("num2的值是:%d\tnum2的地址是:%p\n", num2, &num2);
    //结论:其实指针就是一个变量,它是一个存放了某个变量地址的变量
    *ptr2 = 1111;
    *ptr1 = 1212;
    printf("num1的值是:%d\tnum1的地址是:%p\n", num1, ptr1);
    printf("num2的值是:%d\tnum2的地址是:%p\n", num2, &num2);

    //第一节
    int num = 9;
    int * ptr_num = &num;
    int ** ptr_num2 = &ptr_num;
    //%p是指针占位符  %x 是十六进制占位符
    printf("num变量的地址是:%p\t%x\n", ptr_num,&num);
    printf("ptr_num指针的地址是:%p\n", ptr_num2);
    printf("原空间num对应的值是:%d\n", **ptr_num2);
    printf("*ptr_num对应的值是:%d\n", *ptr_num);

    return 0;
}