首页 > 代码库 > C++ 之 指针详解篇(一)

C++ 之 指针详解篇(一)

  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 = 7a = 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者的输出结果一样。

 

C++ 之 指针详解篇(一)