C++ 指针入门,一文、一代码、一席话带你了解指针

1.好了兄弟们废话不多说直接上课;

要想了解指针我们就先来讲一下一个普通的int变量;

例如:

int a=1;

那么 ‘a’ 这个变量都包含了什么呢?

包含了两个信息:

1)a本身的值;

2)a在内存中的地址(每一块内存都有相对应的地址)

我们可以以下面的代码吧这两部分信息打印出来

#include<iostream>
using namespace std;
int main()
{
int a=1;
cout <<"a的值是 " << a <<endl; //打印a的值就不多说了吧
cout <<"a的地址是"<< &a<<endl; //取地址符&也都知道吧,和c语言一样
}  

好的输出结果直接上图

这够直白了吧

再来复习一下 

a表示两部分,1是它本身的值,2是他所在的内存地址

好了接下来继续讲指针

2.指针代表了4部分内容,严格来讲是3部分且听我分析

我们先声明一个指针变量;  

int a=1;

int *p=&a;

好了接下来就是敲黑板的时间了

int * 和int一样是一种数据类型,比如说 p的数据类型就是int * 类型的;

指针 p包含了以下的内容

1.p本身的值        //本身的值就是一个地址,指针本来就是用来存储地址的

2.p本身的地址  以&p表示  //本身的地址,稍微有些绕,p他也是一个变量虽然它是用来存储地址的,但是他本身也要有地址(不然他拿什么来存这些个地址呢)

3.p指向的地址 (这个其实就是和1是相同的,它指向的地址和就是他本身值呗,你品,你在品)

4.p指向的地址所存储的值 以*p表示(这个也有点绕,但是你细品就品出来了,它指向的地址上存储了一个变量a,a的值是1)

直接上代码:

#include<iostream>
using namespace std;
int main()
{
    int a=10;
    int *p;
    p=&a;
    cout<<"a的值是 "<<a<<";a的地址是 "<<&a<<endl;
    cout<<"p的值是 "<<p<<";p的地址是 "<<&p<<" *p的值是 "<<*p<<";"<<endl;
}

来上运行结果

3.这么说是不是有点干,那我就给你编个故事;

你是一个土皇帝,你有有《600吨黄金》,你把黄金存在了一个非常隐蔽的地宫里,然后你把这个地宫命名为《龙穴》,但是没人知道龙穴在哪里,你害怕以后你的子孙被别人攻打无力还手,没钱组建军队还击,于是你将一个写有龙穴位置的《藏宝图》  放在了《多宝村》让你的子孙在必要的时候去拿藏宝图,然后你的子孙拿着藏宝图找到了龙穴,然后发现龙穴有《600吨黄金》然后招兵买马把你的国家又夺了回来;

这故事主要又四点需要注意

龙穴

600吨黄金

多宝村

藏宝图

多宝村(指针p的地址)放着藏宝图(指针p的值)指针p的值就是a的地址

龙穴(变量a的地址)放着600吨黄金(a的值)

你告诉了你的孙子小明多宝村的位置,然后小明拿着多宝村里的藏宝图,看到藏宝图上写着龙穴的位置,然后找到了龙穴,发现穴里藏有600吨黄金;

4.我写一个简单的程序来表达一下;

#include<iostream>
#include<string>
using namespace std;
int main()
{
    string longxue = "600吨黄金";
    string* cangbaotu = &longxue;
    cout << "你告诉了你的孙子小明多宝村的位置"
        << &cangbaotu << "(指针p的地址);\n\n"
        << "然后小明根据地址" 
        << &cangbaotu
        << "(指针p的地址)找到了多宝村,并拿到了放在多宝村的藏宝图\n\n"
        << "藏宝图写着龙穴的位置"
        << cangbaotu << "(变量a的地址);\n\n";
    cout << "小明按照藏宝图上写的位置"
        << cangbaotu
        << "(变量a的地址) 找到了龙穴;"
        << "\n\n发现龙穴里放着"
        << longxue
        << "(变量a的的值)";
}

程序输出看图

 5.最后再说两个需要特别注意的点

不能够将一个数值或者一个变量直接赋值给指针

例如以下两种赋值方法都是不可行的

int a=2;

int *p;

*p=a; //这些都是错误的赋值方法,因为此时指针p只是声明了,并未初始化,你要问我什么是初始化,初始化就是p本身是有值的,但是显然p这时候没有所以会报错;

*p=2; //这个也是不对的,这样做是非常危险的,*p表示了指针p指向的地址的值,你和你的指针并不知道数字‘2’的地址在哪里,万一出了个bug你怎么查,这比藏到棺材里都隐蔽;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值