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你怎么查,这比藏到棺材里都隐蔽;