• 06_指针


    一、导入:

    指针是C语言里最强大的特性之一,当然它也是最容易让我们困惑的,所以尽量在开始时就正确的理解其概念.

    二、指针的定义

     可以存储地址的变量称为指针(pointers);

    类型 *指针变量名

    int  *  pj;

    char  *s;

    float  *var;

    三、指针的初始化

    int i;

    int *pi=&i; //&是取变量地址的符号 之前的scanf里用到过

    四、通过指针访问值

    int i=123321;

    int *pi=&i;  //实际上int*是类型  pi是指针变量名

    printf("%d,%d ",i,*pi);

    int  *pi

    int*  pi

    int  *  pi

    以上三种写法等价

     实例:

    #include <stdio.h>
    #include <string.h>
    int main(void)
    {
        int i[2]={100,200};
    
        int *p=&i;
        printf("%x, %d
    ",p, *p);
    
        p=(int*)((int)p+sizeof(int));
    
        printf("%d,%d",i[0],*p);
    
    
        getchar();
        return 0;
    }
    View Code
    95f8fc, 100
    100,200
    View Code

    五、指针的命名

      以后我们编写的代码越来越大,很难分清那个是变量,那个是指针,因此我们最好将p作为指针名的第一个字母。这样我们便于区别那个是变量,那个是字母。

    六、指针的运算

    1、++运算

    2、--运算

    3、+运算

    4、-运算

        

    #include <stdio.h>
    #include <string.h>
    int main(void)
    {
        int  *pj;
    
        pj=(int*)10;
        printf("pj=%d, *pj=%d
    ",pj, sizeof(pj) );
        pj=pj-2;//10-4*2
    
        printf("%d
    ",pj ); // sizeof(double)
    
        getchar();
        return 0;
    }
    View Code
    pj=10, *pj=4
    2
    View Code

    七、用指针访问数组

      

    #include <stdio.h>
    #include <string.h>
    int main(void)
    {
        int i;
        int ai[11]={0,11,12,13,14,5,6,7,8,9,10};//12ff3c
        int* pi=&ai[10] ;
        for (i=0;i<11;i++)
        {
            printf("%#x,%d 
    ",pi,*pi--);
        }
    
        getchar();
        return 0;
    }
    View Code
    0xdefd48,10
    0xdefd44,9
    0xdefd40,8
    0xdefd3c,7
    0xdefd38,6
    0xdefd34,5
    0xdefd30,14
    0xdefd2c,13
    0xdefd28,12
    0xdefd24,11
    0xdefd20,0
    View Code

    八、指向常量的指针

      定义形式: const 类型 * 指针名;

      不能通过指针修改地址里的值。

         int i=0x123;       

             const int *p=&i; 

             *p=0; //错误

    //前置const 指针

     九、  常量指针

      定义形式: 类型* const 指针名;

    后置const不能改变地址

         int i=0x123;

             int j=0x456;

             int * const p=&i;

             *p=0; //正确

              p=&j; //错误

    //后置const指针

    小结:

    前置const不能通过指针改变地址内的值 (在*号前) *p=???;

    后置const不能改变地址,也就是不能从新给指针赋值(在*号后) p=???;

    #include <stdio.h>
    #include <string.h>
    int main(void)
    {
        
        // const int *p=(int*)1;     
        ////*p=0; //错误
        // p=(int*)0x333;
    
    
        // int i=100;
        // int j=200;
        // int const *p=&i;     
        //*p=0; //错误
        // i=0;
        // p=&j;
         
    
        int i=0x123;
        int j=0x456;
        int  * const      p=&i;
        *p=0; //正确
        // p=&j; //错误
          
    
        getchar();
    
        return 0;
    }
    View Code

    十、  用指针访问一维数组        

    #include <stdio.h>
    #include <string.h>
    int main(void)
    {
        //代码
    
        int i=0;
    
        int a[2]={11,22};
    
        int *p=&a; //int *p=&a[0];
    
        printf("%d
    ",*p);
    
        p++;
    
        printf("%d",*p); 
    
        /*代码
    
        int i=0;
    
        int a[2]={11,22};
    
        int *p=&a; //int *p=&a[0];
    
        for(i=0;i<2;i++,p++)
    
        {
    
            printf("%d
    ",*p);
    
        }     
    
        代码
    
        int i=0;
    
        int a[2]={11,22};
    
        int *p=&a; //int *p=&a[0];
    
        for(i=0;i<2;i++)
    
        {
    
            printf("%d
    ",p[i]);
    
        } */     
        getchar();
        return 0;
    }
    View Code

     二、  用指针访问二维数组               

           

    三、  用指针访问三维数组        

            

    #include <stdio.h>
    #include <string.h>
    
    int main(void)
    {
        int a[2][3][4]={
            {{ 1, 2 ,3 ,4}   ,  {5, 6, 7, 8}  ,{ 9,10,11,12}},
            {{13,14,15,16}   ,  {17,18,19,20} ,{21,22,23,24}}
        };
        //int (*p)[3][4]=(void*)0x12ff04;//0x12ff04
        int (*p)[3][4]=a;
        int i,j,k;
        printf("%#x
    ",&a);
    
    
    
        for (i=0;i<2;i++)
    
        { 
    
            for (j=0;j<3;j++)
    
            {
    
                printf("{");
    
                for (k=0;k<4;k++)
    
                {
    
                    printf("%d,",p[i][j][k]);
    
                }
    
                printf("},");
    
            }
    
            printf("
    ");
    
        }
    
        getchar();
    
    
    
        return 0;
    
    }
    View Code
    0xcffb90
    {1,2,3,4,},{5,6,7,8,},{9,10,11,12,},
    {13,14,15,16,},{17,18,19,20,},{21,22,23,24,},
    View Code

    小结:

      访问 int  a[x][y][z][i][j]的指针 定义为 int  (*p)[y][z][i][j]

     

  • 相关阅读:
    家庭记账本开发记录2
    家庭记账本开发记录1
    构建之法阅读笔记——具体职位、用户和行业篇
    构建之法阅读笔记——团队篇
    js学习17
    js学习15
    js学习14
    js学习13
    js学习12
    js学习11
  • 原文地址:https://www.cnblogs.com/sd-xyy/p/12907509.html
Copyright © 2020-2023  润新知