指针

来源:互联网 发布:ubuntu 14.04u盘镜像 编辑:程序博客网 时间:2024/06/05 19:56

//C语言第八讲,指针

        

        // 数据的访问方式直接访问(直接访问内存单元中的内容)和间接访问(通过内存单元编号以及数据所占字节数,访问内存中的数据)

        

        //直接访问

//        int a=20;//(一个字节占八位)

        // 字节和位

        // 字节是最小的存储单元,一个字节被称为一个存储单元(内存单元),不同的数据类型所占的存储单元也不同

        

        // 一个字节占八位

            //基本数据类型

        /*char 一个字节      一个内存单元

         short 两个字节     两个内存单元

         int 四个字节       四个内存单元

         long四或八个字节    四或八个内存单元

         float四字节        四个内存单元

         double八字节       八个内存单元*/

       // 为了正确访问内存单元,每个内存都有一个编号。内存单元的编号称作地址。

       // 内存地址==地址==内存单元编号

                  //    内存单元中的 内容才是我们关注的数据

        

      

        

        //  指针就是内存地址。我们习惯上把内存地址叫做指针(内存地址简称为地址)

//        & 取址符可以查看一个内存变量的内存地址(内存首地址)

//        格式化输出内存地址用%p

        

//        int a=6666;

//        printf("&a(a的内存地址) = %p\n",&a);

//        

//        int b=45,c;

//        printf("&b(b的内存地址) = %p\n",&b);

//        printf("&c(c的内存地址) = %p\n",&c);

//        double d=3.1415926;

//        printf("&d(d的内存地址) = %p\n",&d);

//        char r='k';

//        printf("&r(r的内存地址) = %p\n",&r);

//        char s='s';

//        printf("&s(s的内存地址) = %p\n",&s);

        

        

        // &取的只是首地址,并不是a只占这一个内存地址,变量a的数据类型决定a占几个内存地址

        

        

        // 指针变量:存放内存地址的变量;

        // 基本数据类型 * 变量名 =内存地址;

        

        //        int *q= NULL;//恒等于0

        //        printf("q=%p\n",q);

        //取值操作符:*。我们通过*来访问内存单元中存储的数据。(*取值,&取址)


//        int a=110;

//        printf("a=%p\n",&a);

//        int *p =&a;

//        printf("p=%p\n",p);

//        printf("a=%d\n",*p);

//        printf("a=%d\n",a);

        

//        float b=3.1415;

//        printf("b=%p\n",&b);

//        float *p =&b;

//        printf("p=%p\n",&b);

//        printf("b=%f\n",b);

//        printf("b=%f\n",*p);

        

//        char c='k';

//        printf("c=%p\n",&c);

//        char *p=&c;

//        printf("p=%p\n",p);

//        printf("c=%c\n",*p);

//        printf("c=%c\n",c);

        

//        double d=0.618;

//        printf("d=%p\n",&d);

//        double *p=&d;

//        printf("p=%p\n",p);

//        printf("d=%f\n",d);

//        printf("d=%f\n",*p);

//        

//        long e=140;

//        printf("e=%p\n",&e);

//        long *k=&e;

//        printf("k=%p\n",k);

//        printf("e=%ld\n",e);

//        printf("k=%ld\n",*k);

//        

        

        //指针的重指向,

        //指针变量的赋值意味着重新指向,而不是同时指向多个地址

//        int a=3,b=5;

//        printf("a=%p\n",&a);

//        printf("b=%p\n",&b);

//        int *p=&a;

//        p=&b;

//        printf("p=%d\n",*p);

//        printf("p=%p\n",p);

        

//        int *p;(整形指针)

//        double *q;(双精度)

//        char *g;()

        

//        指针变量所占字节数 只与 操作系统有关(32位操作系统下占4字节,64位操作系统下占8字节)

//        

//        int a=20;

//        int *p=&a;

//        printf("SizeA = %lu\n",sizeof(a));

//        printf("SizeP = %lu\n",sizeof(p));

        

        // 特别注意

//        int *j = &a;//如果出现*的地方,前边有任何类型修饰符,比如(int char等),此时*仅仅起到表示作用,告诉编译器这是一个指针变量(取地址)

        

//        *j=337; // 如果出现*的地方,前边没有任何类型修饰符,此时*代表取值操作符,他会把指针指向的区域中的内存取出来(取值)

//        j;// 如果前边没有*和类型修饰符,那么这个变量就是一个指针变量,它里边存储着某一个内存地址

        

        

        // 指针赋值

        // C语言允许使用赋值运算符对指针进行赋值;

        

//        int i,j,*p,*q;

//        p=&i;

//        q=&j;

//        i=1;

//        *q=*p;//如果*p=*q,则输出结果位0

//        printf("j=%d\n",j);

//        printf("p=%p\n",p);

//        printf("q=%p\n",q);

//        printf("*p=%d\n",*p);

//        printf("*q=%d\n",*q);

        

        // 练习定义一个函数,并且在内部修改外部变量的值;

       

        int value=99;

        printf("&value=%p\n",&value);

        printf("value=%d\n",value);

        changeValue(value);

        printf("value=%d\n",value);

/*前面的定义

//函数声明

void changeValue(int value);

//函数定义

void changeValue(int value){

    value = 998;

    printf("value=%d\n",value);

  }


*/



0 0