• 指针,c语言的灵魂


    指针是一个值为内存地址的变量。

    变量是一块内存空间,指针是变量,是用来存储内存地址的变量。

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int num = 9;
        printf("num变量的地址为:%p
    ",&num); // p表示指针占位符
        return 0;
    }
    
    

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int num = 9;
        int * ptr_num = &num;
        printf("num变量的地址为:%p
    ",ptr_num); // p表示指针占位符
        return 0;
    }
    
    

    根据地址,找到空间!然后操作空间!

    变量地址也占用空间,只不过占用的不是内存空间,而是寄存器的存储空间。

    内存地址实际上是一种偏移量,存储于段寄存器中。内存地址只是一种抽象,不是真正的物理内存地址,而是逻辑地址。由逻辑地址寻找到物理地址需要经过 逻辑地址->线性地址->物理地址 转换过程,而这些过程都是基于寄存器完成的。

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int num = 9;
        int * ptr_num = &num;
        * ptr_num = 10;
        printf("* ptr_num的值为:%d
    ",* ptr_num);
        printf("num的值为:%d
    ",num); // p表示指针占位符
        return 0;
    }
    
    

    指针的类型,跟他所指向的数据结构有关。
    基本类型的指针指向基本类型的数据结构。
    比如:char * p; int *p; float *p; double *p;
    分别指向的是char, int ,float, double 类型的变量。

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int num1 = 1024;
        int num2 = 2048;
        int * ptr1;
        int * ptr2;
        ptr1 = &num1;
        ptr2 = &num2;
        printf("num1的值是%d	num1的地址是:%p
    ",num1,ptr1);
        printf("num2的值是%d	num2的地址是:%p
    ",num2,ptr2);
    
        // 将变量1的值赋给变量2
        num2 = num1;
        printf("num1的值是%d	num1的地址是:%p
    ",num1,ptr1);
        printf("num2的值是%d	num2的地址是:%p
    ",num2,ptr2);
    
        *ptr2 = *ptr1; // 等价于 num2 = num1
        printf("num1的值是%d	num1的地址是:%p
    ",num1,ptr1);
        printf("num2的值是%d	num2的地址是:%p
    ",num2,ptr2);
    
        // 地址变了,num1,num2不受影响
        ptr2 = ptr1;
        printf("num1的值是%d	num1的地址是:%p
    ",num1,ptr1);
        printf("num2的值是%d	num2的地址是:%p
    ",num2,ptr2);
    
    
        return 0;
    }
    
    

    一个变量就是一个内存空间,内存一定是有物理地址的!指针就是保存变量内存物理地址的变量!

    指针与数组

    数组是一个连续的内存空间,数组名就是它的首地址。

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        double score[] = {98,87,65,43,76};
        printf("数组的首地址:%p	 数组手元素的地址 :%p
    ",score,&score[0]);
    
    }
    
    

    数组名就是数组元素的首地址。

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int i;
        double score[5] = {98,87,65,43,76};
        double * ptr_score;
        ptr_score = score;
        for (i=0;i<5;i++) {
            printf("%.2lf
    ",*ptr_score++); // 通过首地址取找数组元素的值
        }
    
        for (i=0;i<5;i++) {
            printf("%.2lf
    ",score[i]);
        }
    
    }
    

    等价的!double类型的数据,每个数据移动了8个字节。物理地址是一个十六进制的数字。

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int array[] = {15,20,25,30,35};
        int i;
        int * ptr_array = array;
        for (i = 0;i<5;i++) {
            printf("第%d个元素的值为%d,地址为%p
    ",i,*ptr_array,ptr_array);
            ptr_array ++ ;
        }
    
        /*
        第0个元素的值为15,地址为0028FF0C
        第1个元素的值为20,地址为0028FF10
        第2个元素的值为25,地址为0028FF14
        第3个元素的值为30,地址为0028FF18
        第4个元素的值为35,地址为0028FF1C
        */
        return 0;
    }
    
    

    int型地址间隔4个字节。

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #define N 7
    
    int main()
    {
        int array[N] = {15,20,25,30,35,40,90};
        int i;
        int temp;
        // 实现数组的逆序
        // 数组的首尾元素进行交换
        for (i = 0;i<floor(N/2);i++) {
            temp = array[i];
            array[i] = array[N-i-1];
            array[N-i-1] = temp;
        }
    
        for (i = 0;i<N;i++) {
            printf("交换后第%d元素的值为:%d
    ",i,*(array + i));
        }
        return 0;
    }
    
    

    逆序数组,找规律是写程序必备的技能!

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #define N 7
    
    int main()
    {
        int array[N] = {15,20,25,30,35,40,90};
        int i;
        int temp;
    
        int * ptr_head;
        int * ptr_foot;
        ptr_head = &array[0];
        ptr_foot = &array[N-1];
    
        // 实现数组的逆序
        // 数组的首尾元素进行交换
        for (i = 0;i<floor(N/2);i++) {
            temp = * ptr_head;
            * ptr_head = * ptr_foot;
            * ptr_foot = temp;
            ptr_head ++;
            ptr_foot --;
        }
    
        for (i = 0;i<N;i++) {
            printf("交换后第%d元素的值为:%d
    ",i,*(array + i));
        }
        return 0;
    }
    
    

    指针实现数组逆序!

    二维数组与指针

    首地址

    &a[0][0]
    

    有祥有略!有精有简!有的放矢有的取舍去学习!

    何为二维数组,如何理解?由n个一维数组组成!

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    
    int main()
    {
        int i,j;
        double score[5][3] = {
            {55,56,57},
            {58,59,60},
            {61,62,63},
            {64,65,66},
            {67,68,69}
        };
    
        // 传统的访问方式
        for (i = 0;i < 5;i++) {
            for (j = 0;j <3 ;j++) {
                printf("%.2lf	",score[i][j]);
            }
    
            printf("
    ");
        }
    
        printf("=================================
    ");
    
        // 指针的方式访问
        for (i = 0;i < 5;i++) {
            for (j = 0;j <3 ;j++) {
                // printf("%.2lf	",*(score[i] + j));
                printf("%.2lf	",*(*(score+i) + j));
            }
    
            printf("
    ");
        }
    
    
        return 0;
    }
    
    

    *(*(score + i) + j) 获取二维数组的公式!

    老九语录,会赋值,会打印就差不多了!多练习练习再做个小项目就可以了!

  • 相关阅读:
    linux-溢出程序
    linux下edb调试器
    IOS 学习
    xcode+OC基础学习
    mailcarrier25 EMAIL程序 典型覆盖返回地址XPSP3
    easyftpsvr-1.7.0.2 POC
    VS2010 MSDN Help Library 出现问题处理方法
    虚拟机XP 连接 虚拟机 linux
    修复文章···
    枚举所有进程所有模块,删除制定进程
  • 原文地址:https://www.cnblogs.com/jiqing9006/p/8025510.html
Copyright © 2020-2023  润新知