C++学习笔记(五)初识指针

1.指针的大小

分为指针本身的大小(由系统决定)和在指针运算时候,指针变化大小

①指针本身大小

32位系统大小一般为4,64位系统位8

int* ps = new int;

cout<<"size.ps = "<<sizeof(ps)<<endl;

delete ps;

/*********运行结果**************

size.ps = 8

*******************************/
/*我的电脑是64位系统*/

②指针变化大小

int* ps = new int;
    cout<<"size.int = "<<sizeof(int)<<endl;
    cout<<"ps = "<<ps<<endl;
    ps++;
    cout<<"ps = "<<ps<<endl;
    ps++;
    cout<<"ps = "<<ps<<endl;
    delete ps;

/***********运行结果**************

size.int = 4
ps = 0x7c5f60
ps = 0x7c5f64
ps = 0x7c5f68

*******************************/
/*我的电脑的int是4byte,
所以每次加4
如果是short每次加2
char每次加1
以此类推*************************/

2.如何声明一个指针变量?

指针是指向地址空间的一个标记,所以要么新开辟一块地址,要么指向原有的地址;

①指向新开辟的地址

这时候就需要我们的new

    int* ps = new int;//开辟了一块可以存储int大小的空间,我的电脑是4个字节
    *ps = 2;//给这个空间存储数据2
    cout<<"ps.address = "<<ps<<endl;
    ps++;
    cout<<"now ps.address = "<<ps<<endl;
    delete ps;//new和delete成对使用,养成好习惯
/*******运行结果****************

ps.address = 0xf25f60
now ps.address = 0xf25f64

********************************/
/***************************************
要用来存什么类型数据,就声明什么类型指针
如存char :char* = new char;
存float:float* = new float;
******************************************/

②指向已有的地址

int arr[4] {5,6,7,8};
    int* ps = arr;
    float var;
    float* pw = &var;
    delete ps;
    delete pw;

/*上面,分别声明了,指向数组的指针,指向变量var的指针*/

3.数组可以看作指针

可以把数组名看作是指向数组首元素地址的指针,只不过,这个指针是个定值,而创建的指针可以变化;

 int arr[4] {5,6,7,8};
    int* ps = arr;
    cout<<"ps = "<<ps<<endl   //输出ps地址
        <<"arr = "<<arr<<endl;//输出arr地址
    //可以看到arr和ps地址完全一致
    ps++;  //ps可以运算,但是arr不可以,arr++是不合法的;
    cout<<"now ps = "<<ps<<endl;
    delete ps;
/*********运行结果***************

ps = 0x61fe00
arr = 0x61fe00
now ps = 0x61fe04

*******************************/

4.指针的运算

①解引用

int arr[4] {5,6,7,8};
    int* ps = arr;
    ps++;
    cout<<"*ps = "<<*ps<<endl;
    delete ps;
/******运行结果************

*ps = 6

**************************/
/*ps指针原本指向首元素也就是5的存储地址,然后ps++,指向了6的地址,然后*ps就是读取存在现在ps的地址下的值,也就是6*/

②算数运算

int arr[4] {5,6,7,8};
int* ps = arr;
ps = ps + 3;//算术运算
cout<<"*ps = "<<*ps<<endl;
delete ps;
/******运行结果********

*ps = 8

**********************/

③指针和数组间转换

int arr[4] {5,6,7,8};
int* ps = arr;
delete ps;

对于上面的代码,arr[0]和*ps意思一样,arr[2]和*(ps + 2)意思一样;

arr[i] 和 ps[i] 意思一样

另外一般情况下,cout<<arr;和cout<<&arr;结果一样,输出的都是&arr[0];

但是意义不一样,arr是首元素地址,&arr是整个数组地址;

5.指针数组

用指针申请若干个相同类型的空间串

int* ps = new int[10];//申请10个int型空间,和int arr[10];一致

ps[5] = 6;//可以和数组一样赋值操作

delete []ps;//删除要加[]

6.指针和结构体(或者共用体或者枚举,在此只以结构体为例)

正确运用ps->name;和(*ps).name;

    struct item
    {
        int num;
        string name;
        float val;
    };
    item it1;
    item* ps1 = new item;
    item* ps2 = new item;
    //尝试写入数据
    getline(cin,it1.name);
    getline(cin,ps1->name);
    getline(cin,(*ps2).name);
    cin>>it1.num;
    cin>>ps1->num;
    cin>>(*ps2).num;
    cout<<"it1.name = "<<it1.name<<endl;
    cout<<"ps1.name = "<<ps1->name<<endl;
    cout<<"ps2.name = "<<(*ps2).name<<endl;
    cout<<"it1.num = "<<it1.num<<endl;
    cout<<"ps1.num = "<<ps1->num<<endl;
    cout<<"ps2.num = "<<(*ps2).num<<endl;
    delete ps1;
    delete ps2;

上述代码可以看出,如果是针对变量(it1、*ps1、*ps2)就用it1.name,用“.”号,如果是针对指针,用ps1->name,用“->”箭头号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值