zoukankan      html  css  js  c++  java
  • 指针的综合运用

    //////////////////////////////////////////////////////////////////////////////例程1////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    #include <stdio.h>
    #include <stdlib.h>
    int main()
    { int x=10;
    int y= 8;
    int *p;//注意此时*号是一个标识符,表示的是指针
    p=&x; // 指针存放的便是地址,所以需要使用地址进行赋值,使用了取地址符号&
    //指针的赋值,和其他的变量差不多,可以重复进行赋值,前一次的赋值将会被覆盖
    p=&y;
    printf("通过指针进行变量的地址的打印;%p ",p); //  注意这里打印的是变量的地址
    printf("通过变量名访问变量的值:%d ",x);
    printf("通过变量名访问变量的值:%d ",y);
    printf ("打印变量的地址:%p ",&x);
    printf ("打印变量的地址:%p ",&y);
    printf ("通过变量的地址访问变量的值:%d ",*(&x));//注意通过地址访问变量的值,通过&符号取地址,再通过*符号读取对应地址的值,****重点 重点 重点
    //注意此时符号*相当于一种运算符,相当于加、减、乘、除
    printf("通过变量的地址访问变量的值:%d ",*(&y));
    //指针=地址
    printf("通过指针输出变量的值:%d ",*p);//此时*号表示取出指针所含的地址的值。
    return 0;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////例程2////////////////////////////////////////////////////////////////////////////////////////////////////////////
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
    int a = 10; //此时存放的是一个整数,并进行初始化
    a = 100; //给整型变量进行赋值
    char b = 'c'; //此时存放的是一个字符, 并进行初始化
    b = 'h'; //对字符变量进行赋值
    int arry[3] = {1, 2, 3}; //此时存放的是一串数据 并进行初始化
    //指针变量存放的便是地址。
    // 1.相同点:
    // 都是变量
    // 2.不同点;
    //变量名不同
    // 变量的类型不同
    //指针变量的申明
    int *p; //定义指针的方法一,通过int定义一个指针
    p=&a;//对指针变量进行赋值,注意此时附加的值是一个地址,此时便可以说明指针变量是用来存放地址的变量,指针也是一个变量
    // int *p1 = &a; //定义指针的方法二,同时进行初始化,该方法时通过指针定义一个变量,简单的说便是指针变量
    //注意不能同时定义两个指针变量名相同的指针变量。

    return 0;
    }

    /////////////////////////////////////////////////////////////////////////////////////////////////////////例程3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
    int*p;
    char* p2;
    int *p3;
    int a=10;
    char c='A';
    int arry[3]={1,2,3};   // 定义数组
    p=&a; //对指针变量进行整形变量的地址的赋值
    p2=&c;//对指针变量进行字符型变量的地址赋值,注意字符变量也具有自己的地址,不能和后面的字符串混淆
    // p3=&arry[0];//对指针变量进行数组的地址的赋值,重点: 数组的第一个元素的地址可以代表数组的地址,这里在前面已经讲解,不再重复讲解,方式一
    p3=arry;//对指针变量进行数组的地址的赋值,数组名表示的就是数组的地址方式二
    printf("通过指针变量打印整型变量的地址:%p ",p);
    printf("通过指针变量打印字符变量的地址:%p ",p2);
    // printf("通过指针变量打印数组变量的地址:%p ",p3);//此时打印的是第一个字符变量的地址
    // printf("通过指针变量打印数组变量的地址:%p ",p3++);   //注意指针所指向的地址发生了偏移
    // printf("通过指针变量打印数组变量的地址:%p ",p3++); //注意指针所指向的地址发生了偏移
    // printf("通过指针变量打印数组变量的地址:%p ",p3);
    // 注意在前面指针所指向的地址进行了移位,后面的打印将会出现变化,应当注意
    //printf("通过指针变量打印字符型变量的值:%c ",*p2);
    // printf("通过指针打印数组元素的值:%d ",*p3++); //通过指针变量打印数组的元素以后,对指针所指向的地址进行移动指向下一个元素的地址
    // printf("通过指针打印数组元素的值:%d ",*p3++); //通过指针变量打印数组的元素以后,对指针所指向的地址进行移动指向下一个元素的地址
    // printf("通过指针打印数组元素的值:%d ",*p3);
    //通过循环将数组进行遍历
    int i;
    for(i=0;i<sizeof(arry)/sizeof(arry[0]);i++){
    // printf("通过指针变量对数组进行遍历%d ",p3[i]); //通过指针的方式遍历数组的元素,这里简单的说明了指针也可以看作是数组。
    printf("通过指针的方式遍历进行遍历%d ",*p3++);   // 注意这里没有只用到符号“i”,所以需要进行p3++ 操作
    }





    return 0;
    }
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////例程4///////////////////////////////////////////////////////////////////////////////////////////
    #include <stdio.h>

    #include <stdlib.h>
    int main()
    { // 指针的运用,系统对指针变量的内存的分布是随机的,不是确定的,但是可以采用指针将特定的数,存入特定的指针当中
    int a;
    a=10;
    int *p;
    p= &a;

    printf("通过指针对变量地址进行打印: %p ",p);
    //通过指针将1存入地址位0060FF00的地址
    volatile int *p2= (volatile int*)0x0060ff00;// 将地址强制的转换成指针的地址,volatile的作用是让CPU再进行当访问值的时候,不通过寄存器访问,直接通过指针的地址进行访问
    //这样访问的数据时时都是更新的,因为通过寄存器访问可能没有访问到改变后的值,出现相应的错误。但是没有寄存器访问的速度快
    *p2=5;
    printf("p2的地址是:%p ",p2);
    printf("打印指针p2存放的数值:%d ",*p2);
    system("pause");
    return 0;
    }
    /////////////////////////////////////////////////////////////////////////////////////////例程5///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    #include <stdio.h>
    #include <stdlib.h>

    函数的封装一
    /*
    void zhuanhuan(int a,int b){// 注意此时在进行函数的封装的时候,定义的形式参数,相当于一个局部的变量,拥有自己独立的地址
    int temp;
    temp=a;
    a=b;
    b=temp;
    printf("输出形式参数中a,b的值:%d %d ",a,b); //此时输出的a,b的值,是形式参数中局部变量a,b的值。
    }
    */
    //函数的封装二
    void zhuanhuan1(int *p, int *p1){
    int temp;
    //事实上此时的改变便是对变量a,b 的值进行改变。
    temp=*p; //此时便是将指针中的数值取出来,通过*号进行取值,再将值赋值给变量temp
    *p=*p1; //注意此时是将指针中的数据,赋值给另一个指针,注意事实上此时的指针便是代表的变量的a,b 的地址。
    *p1=temp; //注意此时便是将变量temp变量赋值给指针p1,同时也要将指针通过*符号进行取值。
    }
    int main()
    {//1.数值的转换
    int a=10;
    int b=5;
    int temp;
    //temp=a;
    //a=b;
    //b=temp;
    printf("打印变量a,b的值: %d %d",a,b);//没有通过转换函数前的变量a,b 的值
    //将函数进行封装
    //zhuanhuan(a,b); //此处在进行传参的时候,指示简单的将a,b变量的值,传输给封装函数的形式参数,并没有将地址传送给形式参数
    //printf("打印指向转换函数以后,a,b的值:%d %d",a,b);//从运行的结果可以看出,a,b的值并没有发生改变
    zhuanhuan1(&a,&b); //此时在进行传参的时候,是将a, b,变量的地址传输给形式参数。同时形式参数为指针变量。
    printf("打印指向转换函数以后的变量a,b的值:%d %d",a,b);//此时打印的变量a,b,的值。是转换结束后的值,a,b的值发生了改变
    return 0;
    }
    //////////////////////////////////////////////////////////////////////////////////////////////////////例程6//////////////////////////////////////////////////////////////////////////////////////////////////////////////
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
    int a=2; //定义整形的变量
    int b=4; //定义整形的变量
    int c=10; //定义整形的变量
    int* arry[3]; //定义指针变量的数组,注意此时数组中的每一个元素都是一个指针
    arry[0]=&a; //用整形变量的地址给指针变量的数组的元素进行赋值,在指针变量的数组中,数组的每一个元素都是指针,用于储存地址,储存的类型,有数组的类型决定
    arry[1]=&b;//用整形变量的地址给指针变量的数组的元素进行赋值,在指针变量的数组中,数组的每一个元素都是指针,用于储存地址,储存的类型,有数组的类型决定
    arry[2]=&c;//用整形变量的地址给指针变量的数组的元素进行赋值,在指针变量的数组中,数组的每一个元素都是指针,用于储存地址,储存的类型,有数组的类型决定
    printf("此时指针数组打印函数变量的地址: ");
    //遍历指针变量数组
    int i;
    for(i=0;i<3;i++){
    printf("打印指针变量数组中的元素地址所包含的数值是:%d ",*(arry[i])); //此时通过i,切换指针遍历数组的索引,切换不同的地址。通过*符号取出地址中的值。
    }
    return 0;
    }
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////例程7///////////////////////////////////////////////////////////////////////////////////////////////////////////////
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    { //上一节我们讲的是指针变量数组,表示的是一个数组
    //这一节我们将要讲的便是数组的指针,表示的是一个指针
    //定义一个数组
    int arry[3]={1,2,3};//注意在进行数组的声明的时候应当书写数组变量的类型,不然将会出现错误。
    int (*p)[3];//定义一个数组指针,数组指针表示的是指针
    int *p2;
    p2= arry;  // 用数组的地址给指针进行赋值

    p=arry;//此处采用的表示数组的数组名对p指针进行赋值,因为数组的变量的名便是数组的地址,所以此处给指针P的赋值依旧的是一个地址,完全符合指针的定义
    //上面的赋值也充分的说明了变量P是一个指针变量。
    printf("通过数组的变量名对数组的地址进行访问:%p ",arry);
    printf("通过数组的首地址对数组的地址进行访问:%p ",&arry[0]);
    printf("通过普通的指针对数组的地址进行访问:%p ",p2);
    printf("通过数组指针对数组的地址进行访问:%p ",p);
    //上面三种方法打印的地址将会是一样的结果
    printf("==================================区别来了,在下面,大家注意了============================================ ");
    printf("通过数组指针对指针的址进行偏移%p ",++p);//从运行的结果可以看出,数组指针的指针偏移量为12位,也就是当前指针数组的大小
    printf ("通过普通的指针对指针的地址进行偏移:%p ",++p2);// 此时普通的指针的指针偏移量是4位,也就是一个数据类型的偏移量
    //由上面可以看出指针数组的偏移量是整个指针数组的长度。重点 、重点、、重点
    system("pause");
    return 0;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////例程8/////////////////////////////////////////////////////////////////////////////////////////////////////////////
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    { int a; //定义一个整形的变量
    int *p; //定义一个整形的指针,注意此时的指针为野指针,这个话题在后面会详细的讲解
    int arry[5];//定义含有五个元素的整形数组
    int *p[5]; //定义一个指针数组,表示的是一个数组,数组的元素全是指针,用于存放地址
    int (*p)[4]; //定义一个数组指针,此时表示的便是一个指针,注意,此时指针的跨度时整个数组。
    int* p();// 定义一个返回值为指针的函数,指针函数
    int (*p)();// 此时定义的是一个函数指针,返回值是整形的
    int **p;//定义二级指针
    void *p;//此时定义的指向空的对象的指针
    //对于指针的学习就到此结束,注意牢记指针所装载的东西永远是地址。重点 重点 重点
    return 0;
    }

  • 相关阅读:
    concrete maths ch4 number theory
    Aho-Corasick algorithm
    Finding repetitions
    Suffix Automaton
    Z-function and its calculation
    mongodb安装与启动
    centos redis 集群搭建
    nginx实现热部署(平滑升级)
    nacos集群部署安装
    springboot+zookeeper+dubbo整合
  • 原文地址:https://www.cnblogs.com/Nic-zhang/p/13824890.html
Copyright © 2011-2022 走看看