指针000

指针是C和C++的重点,也是后面学习数据结构的基础,因此深刻理解指针的概念很重要。但是指针的概念比较抽象,难于理解,而且一些复杂的程序中都是离不开指针的,如果不能理解指针,那么就不能理解较为复杂的程序了,作者结合了自己学习C++的经验,对指针,指针变量,地址作如下阐述。

1.什么是指针:

         程序中最离不开的就是变量,而变量相当于是一个容器,是用来存放数据的,变量是存放在内存中的。在C++ 中定义变量的形式是: 数据类型 + 变量名,这里的变量名实际上是一个符号地址,在程序编译时,操作系统将为每个变量在内存中分配内存,所以每个变量都有一个在内存中的地址,即物理地址,并将变量的符号地址(变量名)和物理地址关联起来,所以,我们在程序中对变量名的操作,编译时编译器都会将变量名转换为变量在内存中的物理地址,从而实现了对内存中指定地址区域的数据的操作,这就是变量的实现原理。变量在内存中的地址又称作指针,我们说“变量的地址” 就等价于 “变量的指针”,但是指针和指针变量是不一样的。

2.指针变量的概念:

        从上面我们可以看到,每个变量都有一个符号地址(变量名)和物理地址(在内存中的位置,又叫做指针)。变量是可以存储数据的,但是指针变量与普通变量不同,它用来存放普通变量的地址,即指针变量是用来存放普通变量的指针。要知道,指针变量也是一个变量,在内存中也是占内存的,只不过它不存放基本类型数据,而是存放其他基本类型变量的地址。既然指针变量也有自己的物理地址,那么指针变量的地址用什么 来存储呢?用比该指针类型高一级的指针变量来存放指针变量的地址,如二级指针变量存放一级指针变量的地址,三级指针变量存放二级变量的地址,依次类推。

3.总结:

     牢记三句话:

     指针就是地址,地址就是指针;指针变量是一个变量,它保存了基本类型变量的地址。

     如果指针变量p保存了变量a的地址,那么称作p指向了a,*p 就是变量a。

     如果p是一个指针变量,*p 表示了以 p 的内容为地址的变量,就是p指向的变量。

4.举例如下:

                    int a ;  //定义int类型变量

                    int *p = &a;   //变量 p 是一个 int* 类型的一级指针变量,&是取地址符,p保存了a 的地址

                    cout << *p <<endl; //输出 p 指向变量的值,即输出a的值

    cout <<  p << endl; //输出 p 的值,即输出变量a在内存中的地址

                    int **q;  //定义二级指针变量

                    q = &p; // 二级指针变量q保存了一级指针变量p的地址

                    cout << q <<endl; //输出指针变量p在内存中的地址

    cout <<  *q << endl; //输出q指向变量的值,即变量p的值,即a的地址

    cout <<  **q << endl; //可以这样理解  cout<<*(*q), 等价于 cout <<*p, 即输出a的值
int a=10;
    int*p=&a;
    printf("%p\n",&a);
    printf("%p\n",p);
    printf("%p\n",&p);
    printf("%d\n",*&a);//10




    //定义指针变量
    /*int num = 7;
    int* p = &num;
    printf("数值%d所在的地址是 %p\n", num, p);
    //注意这里*操作符为解引用操作符,它返回指针p所指的对象的值(注意不是地址)。
    printf("指针p所指向的地址为 %p , 该地址上所保存的值为%d\n", p, *p);
    //我们可以对*p赋值(对左值赋值),从而改变p所指的地址上所保存的值,从而改变此地址所存储的变量num的值。(上面num的值变为100)
    *p = 100;
    printf("指针p所指向的地址为 %p , 该地址上所保存的值为%d\n", p, num);
    return 0;*/
   //指针的运算
   //取值运算符“&”
    /*int num=10;
    printf("num=%d\n",num);
    printf("num地址=%p\n",&num);
    int *p1;
    p1=&num;
    printf("%p\n",p1);

    int d=10;
    int *e,*f;
    e=&d;
    f=e;
    //都存储d的地址
    printf("d地址=%p\n",&d);
    printf("e=%p\n",e);
    printf("f=%p\n",f);

    float *pF;
    printf("%p\n",pF);//随机地址,最好置于NULL(野指针)*/
    //通过指针变量修改指向的内存中数据
   /* int a=10,*pInt;
    pInt=&a;
    printf("a=%d\n",a);
    scanf("%d",pInt);
   *//* *pInt=100;
    printf("%d\n",*pInt);*//*
    printf("a=%d\n",a);*/

    //取值运算符*

    /*int a=2024;
    int *p;
    p=&a;
    printf("%p\n",&a);
    printf("%p\n",p);
    printf("%d\n",*p);*/
    //通过指针变量修改指向内存地址位置的值
    /*int i1=10;
    int *p1=&i1;
    printf("i1=%d\n",i1);//10
    *p1=100;
    printf("i1=%d\n",i1);//100*/
    /*int *p1,*p2;
    int a,b;
    scanf("%d %d",&a,&b);
    p1=&a;p2=&b;
    int max=a;
    if(max>b){
        p1=&a;
        p2=&b;
    }
    else {
        p1=&b;p2=&a;
    }
    printf("%d地址=%p\n",a,&a);
    printf("%d地址=%p\n",b,&b);
    printf("p1=%p\n",p1);
    printf("p2=%p\n",p2);
    printf("p1指向=%d\n",*p1);
    printf("p2指向=%d\n",*p2);*/
    /*int a,b;
    scanf("%d %d",&a,&b);
    int *p1=&a;
    int *p2=&b;
    printf("p1指向=%d\n",*p1);
    printf("p2指向=%d\n",*p2);

    if(a<b){
        int* p;
        p=p1;
        p1=p2;
        p2=p;
    }
    printf("p1指向=%d\n",*p1);
    printf("p2指向=%d\n",*p2);*/

   /* int b=999;
    int *p=&b;
    printf("%p\n",&b);
    printf("%p\n",&*p);
    printf("%d\n",*&b);*/
   /*int a=10;
   int *p;
   p=&a;
   int b=100;
   p=&*&b;
   printf("%d",*p);*/

指针与整数值的加减运算

    int arr[5]={1,2,3,4,5};
    int *p=&arr[1];
    printf("数组地址为:%p\n",arr);
    printf("数组首元素%d地址为:%p\n",arr[0],&arr[0]);
    printf("p的地址为:%p,对应的值为%d\n",p,arr[1]);
    printf("p+1的地址为:%p,对应的值为%d\n",p+1,*(p+1));//3
    printf("p-1的地址为:%p,对应的值为%d\n",p-1,*(p-1));//1
    return 0;
int arr[LENGTH]={10,20,30,40,50};

    //传统遍历
    for(int i=0;i<LENGTH;i++){
        printf("%d",arr[i]);
        printf(" ");
    }
    printf("\n");
    //指针方式遍历
    int *p=&arr[0];
    for(int i=0;i<LENGTH;i++){
        printf("%d",*(p+i));
    }
   /* printf("%d\n",*p);//10
    printf("%d\n",*(p+1));//20
    printf("%d\n",*(p+2));//30
    printf("%d\n",*(p+3));//40*/

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值