C++的指针太重要了,我们有必要去掌握它。所以必须认真的对待指针。先来讲解什么是指针。(重点掌握)
指针是存储内存地址的变量,内存又是什么?内存是干啥用的?简单的说,就是存储一些二进制数据,它是按一定的顺序存储的线性单元结构。那一个数据又是如何存储在内存的呢?这些问题都是汇编的基础知识,如果你学过汇编理解这真的不是难事。闲话越扯越远了,通常数据的存储在内存地址中,不同的计算机它的地址也会不同。假设我们存储了一个变量是整形的,系统会自动的分配一个内存地址给它,要获取内存地址,可以用&运算符。结合示例演示
#include <iostream> using namespace std; int main() { int i; long j; bool t; i = 5; j = 100L; t = true; cout <<"i = "<<i<<", &i = "<<&i<<endl; cout<<"j = "<<j<<", &j ="<<&j<<endl; cout<<"t ="<<t<<", &t = "<<&t<<endl; return 0; }
输出结果为:
i = 5, &i = 0012FF7C
j = 100, &j =0012FF78
t =1, &t = 0012FF70
这里的i,j,t的地址用&运算符就可以得到。
每个变量都有地址,我们不知道变量的具体地址,这个时候可以用指针来存储就很方便,当我们需要访问变量的地址的时候,一个指针就轻松的帮我们解决问题。那如果定义一个指针呢?
很简单假如我们存储变量是整形的
int *p;
先来理解这句话的含义:p是一个int类型的指针,p也就可以存储一个变量的地址如上所示
p = &i;
我们就用p存储了i的地址,是不是很方便啊,现在我们已经清楚的知道如何定义一个指针,就是在这个变量前加一个*号.
我们只知道如何定义一个指针,如何使用指针?那如何去获取指针上的值呢?
*p = i;
刚才p指针指向了i的地址,那*p就是i地址上的值,我们可以上机实验就可以得知。我们知道用指针获取变量i上的值这是间接的访问了变量i
*号就是间接的访问了变量i *号具体含义就是存储变量地址上的值
我们不能用
p = i; //不能将一个变量(i)赋给一个地址(p)
学好指针一定用弄清楚指针的地址,指针上的值。结合示例
using namespace std; int main() { int a; int* p; a = 5; p = &a; cout<<"*p = "<<*p<<endl; *p = 7; cout <<"*p = "<<*p<<" , a = "<<a<<endl; a = 0; cout<<"a = "<<a<<" *p= "<<*p<<endl; return 0; } 输出结果: *p = 5 *p = 7 , a = 7 a = 0 *p= 0
从上得出结论当*p被改变的时候,a的值也会改变。当a的值发生改变,*p也会发生改变。也就说明*能改变一个变量地址上的值。
那指针能定义一个数组类型的吗?答案当然是可以的。其实在c++中,数组名就是一个常量指针,指向了数组的第一个元素。
结合示例演示 数组和指针的关系
#include <iostream> using namespace std; int main() { int i[5] = {1,2,3,4,5}; const int* p = i; for (int j = 0; j< 5;j++) { cout<<"i["<<j<<"] = "<<p[j]<<endl; } return 0; }
输出结果
i[0] = 1
i[1] = 2
i[2] = 3
i[3] = 4
i[4] = 5
我们用指针p访问了数组i,而数组i的地址就是第一个元素的地址,我们可以用p[j]或者用*(p+j)访问后面的元素,2者的输出结果一样。