数据结构----指针

指针

定义:
在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。 [1] 在高级语言中,指针有效地取代了在低级语言,如汇编语言与机器码,直接使用通用暂存器的地方,但它可能只适用于合法地址之中。指针参考了存储器中某个地址,通过被称为反参考指针的动作,可以取出在那个地址中存储的值。作个比喻,假设将电脑存储器当成一本书,一张内容记录了某个页码加上行号的便利贴,可以被当成是一个指向特定页面的指针;根据便利粘贴面的页码与行号,翻到那个页面,把那个页面的那一行文字读出来,就相当于是对这个指针进行反参考的动作。
在信息工程中指针是一个用来指示一个内存地址的计算机语言的变量或中央处理器(CPU)中寄存器(Register)【用来指向该内存地址所对应的变量或数组】。指针一般出现在比较接近机器语言的语言,如汇编语言或C语言。面向对象的语言如Java一般避免用指针。指针一般指向一个函数或一个变量。在使用一个指针时,一个程序既可以直接使用这个指针所储存的内存地址,又可以使用这个地址里储存的函数的值。

这种定义较为复杂难以理解,我直接使用代码进行讲解:

简单的来说定义一个int类型的指针就是int *p,p用来存储int类型变量的地址,而在C/C++中,取址符号是&,假设一个变量b,如果将b的地址传给p呢?很简单,p = &b,这表示将b的地址取出,赋给p,再说的简单些,假设b住处的门牌号是001,那么你想找到b就需要先找到门牌号,而指针p则是存储这个门牌号的东西,*p则表示b的值,下面给一个代码:

#include 

using namespace std;

int main()
{
    int a,*p;
    cin >> a;
    p = &a; //将a的地址赋给p
    cout << *p; //输出的*p表示a的值
    return 0;
}

下面我们从简单的一个变量再推广到数组:

如何将指针运用到数组中呢?再C/C++中规定,假设定义一个数组a那么 p = a表示将数组a的首地址赋给p,那什么是首地址呢?首地址就是a[0]的地址,因此p = a也可以写成 p = &a[0],是不是很简单呢?那么数组里那么多元素怎么才能一一表达出来呢,更简单,*(p + i)则表示数组中的数据,这里i为数组的下标,而(p + i)则表示每个元素的地址下面看代码:

#include 

using namespace std;

const int maxn = 1e5+5;
const int N = 10;
int a[maxn];
int *p;

void Iput_data() //读入数据,不多赘述
{
    for(int i = 0 ; i < N ; i++)
        cin >> a[i];
}

void Output_number()		//该函数表示输出数据的值
{
    for(int i = 0 ; i < N ; i++)
        cout << *(p + i) << " "; 
    cout << endl;
}

void Output_address()		//该函数表示输出数据的地址
{
    for(int i = 0 ; i < N ; i++)
        cout << p + i << " ";
    cout << endl;
}

int main()
{
    Iput_data();
    p = &a[0]; //这里也可以写成 p = a; 具体原因上面已经介绍过了
    Output_address();
    Output_number();
    return 0;
}

指针再数据结构中尤为重要,在模拟链表,建立二叉树中作用十分重要!

你可能感兴趣的:(指针,数据结构)