1. 程式人生 > >C語言自學完備手冊(28)——指標(2)

C語言自學完備手冊(28)——指標(2)

版權宣告

陣列與指標概述

陣列和指標雖然是不同的東西,但是兩者有著非常緊密的關係。在C語言中:陣列名原則上會被解釋為指向該陣列起始元素的指標。 通俗地來講:陣列名是一個指標,它指向了陣列的起始元素。例如:有一個數組a[5],那麼陣列名a就是一個指標,它指向了該陣列的起始元素。

請看如下示例:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a[5]={1,2,3,4,5};
    printf("a=%p\n",a);
    printf("&a=%p\n",&a);
    printf("&a[0]=%p\n",&a[0]);
    return 0;
}

結果如下:

a=0060FEFC &a=0060FEFC &a[0]=0060FEFC

從該示例中也可以看:a和&a以及&a[0]的值是一致的,它們均代表了陣列起始元素a[0]的地址。

明白了這一點,我們再來看如下示例:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a[5]={1,2,3,4,5};
    int *p;
    p=&a[0];
    printf("&a=%p\n",&a);
    printf("&a[0]=%p\n",&a[0]);
    printf("p=%p\n",p);
    printf("*p=%d\n",*p);
    printf("a[0]=%d\n",a[0]);
    return 0;
}


在示例中聲明瞭陣列a和指標p,並將&a[0]的值存入p。也就是說:指標p(即p)會被初始化為指向陣列a的起始元素a[0],即p=a[0]。

結果如下:

&a=0060FEF8 &a[0]=0060FEF8 p=0060FEF8 *p=1 a[0]=1

之前我們講解並驗證了:a和&a以及&a[0]的值是一致的,它們均代表了陣列起始元素a[0]的地址。,所以,我們可以優化剛才的示例:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a[5]={1,2,3,4,5};
    int *p=a;
    printf("&a=%p\n",&a);
    printf("&a[0]=%p\n",&a[0]);
    printf("p=%p\n",p);
    printf("*p=%d\n",*p);
    printf("a[0]=%d\n",a[0]);
    return 0;
}

對比可知:將如下兩句程式碼

  int *p;
  p=&a[0];

替換成了:

int *p=a;

小結:

陣列名a會被解釋為&a[0],存入p的值為&a[0]的值,即p=&a[0];指標p會被初始化為指向陣列a的起始元素a[0],即*p=a[0]

p+i規則

指標p指向陣列的元素時,遵循以下規則:

  • p+i 為指向元素e後第i個元素的指標
  • p-i 為指向元素e前第i個元素的指標

今天寫不完了,明天繼續。。。。。。