1. 程式人生 > >C語言 基礎指標簡介

C語言 基礎指標簡介

一、指標

所謂指標,就是一個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的一個地址。這裡介紹一小部分;

首先,介紹聲名指標變數:

int p;       //一個整形數p;
int *p;      //一個指標p;
int p[50];   //一個數組p,其中的所有資料均為int;
int *p[50];  //一個數組p,其中的資料型別均是指標;

 這裡要注意:int p;是定義了一個整型數p;所以int *p;首先是定義了一個整型數*p;並且你所定義的指標即為p(這裡指向p的地址);

二、運算子&和*

這裡&是取地址運算子,*是間接運算子。
&a 的運算結果是一個指標,指標的型別是a 的型別加個*,指標所指向的型別是a 的型別,指標所指向的地址嘛,那就是a 的地址。
*p 的運算結果就五花八門了。總之*p 的結果是p 所指向的東西,這個東西有這些特點:它的型別是p 指向的型別,它所佔用的地址是p所指向的地址。

例如以下程式:

#include<stdio.h>
int main()
{
    int a,b;
    int *p;
    while(scanf("%d%d",&a,&b)!=EOF)
    {
        p=&a;
        b=*p+5;
        printf("%d",b);
    }
}

首先,輸入整型數a,然後,再將a的值賦給指標p,特別注意這裡一定要都是指向地址的變數才對;最後,再將b由*p+5運算得出,執行的結果就是把a的值加上5;

一個簡單的換數:

#include<stdio.h>
void swap(int *p1,int *p2)
{
    int temp;
    temp=*p1;
    *p1=*p2;
    *p2=temp;
}
int main()
{
    int a,b;
    int *pointer1,*pointer2;
    while(scanf("%d%d",&a,&b)!=EOF)
    {
        pointer1=&a;
        pointer2=&b;
        if(a<b)
        {
            swap(pointer1,pointer2);
        }
        printf("%d %d\n",a,b);
    }
}

三、指標與陣列

先看下面一個程式;

#include<stdio.h>
void main(){
    int a[20];
    int *p,*q;
    p=&a[3];
    q=&a[18];
    printf("q-p=%d\n",q-p);
}

算出來執行結果了嗎?沒錯就是q-p=15,這裡的p和q分別指向的是a[3]和[18]的地址,即為p=3,q=18;在這裡a[3]和a[18]都是陣列啊中的一個整型資料,在對其取地址&a[3],&a[18],意為在給指標p、q賦值運算,延伸一下如果再對p做運算p+1,則為將p移向下一個地址,即為&a[4],而*p也就是a[4];

下面來看給一個數組逆序:

#include<stdio.h>
void invert(int *p,int n){
    int i;
    int temp;
    for(i=0;i<=(n-1)/2;i++){
        temp=*(p+i);       //p+i為第i個數,
        *(p+i)=*(p+n-i-1); //p+n-i-1為第n-i-1個數,與p+i位置對稱;
        *(p+n-i-1)=temp;   //把正數第i個數與倒數第i個數交換;
    }
}
void main()
{
    int a[10]={1,3,5,7,9,1,3,5,7,9};
    int i,*p;
    void invert();
    p=a;     //把陣列a賦給指標p,陣列不用取地址&;
    for(i=0;i<10;i++)
    {
        printf("%-5d",a[i]);
    }
    printf("\n");
    invert(p,10);     //代入函式invert,代入指標p,不要加*,就像把陣列代入函式中一樣;
    for(i=0;i<10;i++)
    {
        printf("%-5d",a[i]);
    }
}

 執行結果如下:可以看到還是很耗時間的。

四、更多