zoukankan      html  css  js  c++  java
  • 我的c++学习(9)指针

    ◆ 1、指针变量的赋值、初始化与简单应用

     int x=5,y;
         y=15; // y可以理解成该存储单元的当前名字
         int *ip; // ip是一个指针(变量)
         ip=&y; // ip是存储空间y的地址
         
    
         cout<<*ip<<'
    '; //结果15
         cout<<ip<<'
    ';  //结果001BFC0C
         cout<<&y<<'
    ';  //结果001BFC0C
         cout<<y<<'
    ';;  //结果15
         cout<<x;         //结果5

    //int age1=18, age2=20, *p_age; // p_age=&age1; // cout<<"age of wang ping is"<<*p_age<<endl; //18 // p_age=&age2; // cout<<"age of zhang ling is"<<*p_age<<endl; //20

     ◆ 2、指针变量初始化
     例如: int age , *p_age=&age; //p_age初始化为指向整型量age。
     
    任何类型指针都可以赋以0值(NULL),称空指针,表示该指针不指向该类型的任何一个变量(对象)。注意不是指向地址为0的内存空间。
     
    常量是不可寻址的,但常变量是可寻址的,如:
         p_age=&20; //错误
         const float PI=3.14159;
         float *pointer=&PI; //正确

     ◆ 3、指针使用时注意 •指针类型可以强制转换,有特殊应用,例如:
        int m, *pm=&m;
         char *p1=(char*)&m, *p2=(char*)pm;
    用pm读的是整型数,用p1,p2读的是整型数的第一个字节。
    •同类型的指针可以相互赋值,如有说明:
        int val1=18, val2=20, *p_val1=&val1, *p_val2=&val2;
         // p_val1指向val1,p_val2指向val2
    执行 p_val1=p_val2; 后,则p_val1也指向val2,而没有指针指向val1了。(查看动画演示)
    •必须谨慎使用指针,一旦使用不当会产生灾难性的后果。
     例如,局部指针变量在定义时其中的值为随机数,即指针指向了一个无意义的地址,也可能偶然指向了一个非常重要数据的地址。如果对所指的内存进行不当操作,其中的数据就丢失了。
     再如,全局指针变量,原指向一个局部变量,后来该内存又重新分配了,我们再对该指针所指地址进行操作,同样会发生不可预知的错误。
    •对指针变量决不可以任意赋一个内存地址,结果甚至是灾难性的。如:
        int *P=(int *)0xaf80;
    把指针变量P的初始置为0xaf80,我们并不知道那个内存单元放的是什么数据,这在一般程序中是非常危险的。
    • 如果通过指向对象或结构变量的指针变量来访问其公有成员时,则只要在指针变量名后加箭头号(箭头操作符“->”),再加公有成员名就可以了。

    #include "stdafx.h"
    using namespace std;
    #include<iostream>
    #include<cstring>
    using namespace std;
    
     struct student{
         char name[20];
         char id[10];//学号最好用字符串,当学号以0开头,整数会丢失0甚至认为是八进制
        int age;
         float score;
         char address[30];
     };
     int main(){
         student st1,*prst;
         prst=&st1;
         cout<<"请输入学生的姓名:"<<endl;
         cin.getline(st1.name,20);//cin.getline可输入空格
         cout<<"请输入学号、年龄和入学成绩:"<<endl;
         cin>>st1.id>>st1.age>>st1.score;
         cin.get();//吸收掉换行回车符
         cout<<"请输入家庭住址:"<<endl;
         cin.getline(st1.address,30);
         cout<<"姓名"<<'	'<<prst->name<<'
    ';
         cout<<"学号"<<'	'<<prst->id<<'
    ';
         cout<<"年龄"<<'	'<<prst->age<<'
    ';
         cout<<"入学成绩"<<'	'<<prst->score<<'
    ';
         cout<<"家庭住址"<<'	'<<prst->address<<endl;
         return 0;
     }


     指针常量是固定指向一个对象的指针,即指针本身是常量:
        char ch=’a’,ch1=’x’;
         char * const ptr=&ch; //注意const放在类型说明之后,变量名之前
        *ptr=’b’;//正确
        ptr=&ch1;//错误
    ptr本身在初始化时所指向的地址是不可改变的,但它指向的目标ch的值是可以改变的。
    •常量指针是指向“常量”的指针,即指针本身可以改指向别的对象,但不能通过该指针修改对象。该对象可以通过其他方式修改,常用于函数的参数,以免误改了实参。类似于在“运算符重载”一节中引用参数前加const。
        char ch=’a’,ch1=’x’;
         const char * ptr1=&ch; //ptr1是常量指针
        *ptr1=’b’; //错误,只能做ch=’b’
        ptr1=&ch1; //正确

  • 相关阅读:
    HDU 5818 Joint Stacks
    HDU 5816 Hearthstone
    HDU 5812 Distance
    HDU 5807 Keep In Touch
    HDU 5798 Stabilization
    HDU 5543 Pick The Sticks
    Light OJ 1393 Crazy Calendar (尼姆博弈)
    NEFU 2016省赛演练一 I题 (模拟题)
    NEFU 2016省赛演练一 F题 (高精度加法)
    NEFU 2016省赛演练一 B题(递推)
  • 原文地址:https://www.cnblogs.com/yangwujun/p/3313848.html
Copyright © 2011-2022 走看看