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]);
    }
}

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

四、更多

參見更多指針的詳細用法及問題說明請見: C語言指針詳解(經典,非常詳細)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章