歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C語言中的指針小結

這兩天復習了一下C語言中的指針,發現很多東西幾乎全忘了,然後在CodeBlocks中打印一些小程序,進行知識的恢復,以後再忘了,就到自己的博客中來查看下,順便給一些剛學習C語言的同學一個參考,有不對的地方還請大家來指正,有疑問的請給阿濤留言。

一:五個重點概念

int *a;

int **a;

(1)指針的類型:指針本身自己的類型,如上兩個指針,指針類型就是:int *, int **

          判斷方法:將定義的標識符拿掉,剩下的就是指針的類型

(2)指針指向的類型:指針指向的空間存儲的數據的類型,如上兩個指針,指針所指向的類型是:int     int*

          判斷方法:將定義的標識符和左邊的第一個*號拿掉,剩下的就是指針所指向的類型,這個類型決定了編譯器對

          這個指向的內存空間中的數據作為什麼類型進行處理。

(3)指針所指向的內存空間:由於指針的值就是地址,這個值就是所指向的內存空間的首地址,那麼這個地址空間

          有多大呢?然後就需要看你所指向的是什麼類型了。比如:   int  a;                char b;

                                                                                                           int *ptra=&a;     char*ptrb=&b;

         那麼,ptra指向的空間大小就是一個int的大小,4個字節,ptrb指向的空間大小就是一個char類型的大小,一個

         字節。

(4)指針的內存空間:指針也是一種數據類型,本身自然也有大小,但是不論什麼樣的指針,在32位下的系統中統

         統都是4個字節。因為32位下的地址都是32位的。

(5)指針本身的地址:指針自己也有自己的地址,通過&取地址符也可以打印出來。


下面是我打印的一些小程序,大家可以copy下來挨個運行下,看看差異:

#include <stdio.h>
#include <stdlib.h>
int fun(int num);
int (*fun1)(int num);//指針函數
void swap(int *a,int *b);
int main()
{
    /*指針遍歷數組
    int a[5]={1,2,3,4,5};
    int *aptr=b;
    for(i=0;i<5;i++)
    {
        printf("%d\n",(*aptr));
        (*aptr)++;
        aptr++;
    }
    for(i=0;i<5;i++)
    {
        aptr--;
        printf("after:%d\n",(*aptr));

    }*/
    /*指針遍歷char類型數組
    char b[5]={'a','b','c','d','e'};
    int *ptr=b;
    ptr++;
    printf("%c\n",(*ptr));
    */
    /*32位下所有指針都是4個字節
    char *a;
    printf("%d",sizeof(a));
    */

    /*將地址賦給指針,&是取地址符,&也可以將指針的地址取出來
    int a=10;
    int *ptr=&a;
    printf("%d\n",&a);
    printf("%d\n",&(*ptr));
    printf("%d\n",ptr);
    printf("%d\n",&ptr);
    */
    /*雙指針
    int a=10;
    int **ptr;
    *ptr=&a;
    **ptr=20;
    printf("%d\n",**ptr);
    */
    /*int 變量剛聲明就賦給了空間,但是剛開始是個亂值。
    int a=0;
    printf("%d\n",sizeof(a));
    printf("%d\n",&a);
    */
    /*數組名可以當做指針
    int a[5]={1,2,3,4,5};
    printf("%d\n",*(a+2));
    */
    /*指針和結構體.結構體內的變量不能賦值,結構體可以定義在任何地方,
      但是後面必須有分號
    struct str
    {
        int a;
        int b;
        int c;
    };
    struct str s;
    s.a=100;
    struct str*ptr=&s;
    printf("%d\n",ptr->a);
    */
    /*指針函數
    fun1=fun;
    int a=fun1(5);
   // int a=(*fun1)(5);經過測試也可以
    printf("%d\n",a);
    */
    /*指針自己的地址是不會改變的
    int a[3]={1,2,3};
    int *ptr=a;
    printf("%d\n",ptr);
    printf("%d\n",&ptr);
    ptr++;
    printf("after:%d\n",ptr);//指針指向的地址,增加了4
    printf("after:%d\n",&ptr);//指針的地址,沒有改變
    */
    /*指針轉換
    float a=13.8;
    //int*pa=&a;不經轉換,打印出來是錯誤的
    //int *pa=(int*)&a;//經過轉換也是不行的,指針是不能相互轉換的
    printf("%d\n",a);//應當是%f,不然還是亂的數據
    */
    int a=100;
    int b=200;
    int *pa=&a;
    int *pb=&b;
    swap(pa,pb);
    printf("%d   %d\n",*pa,*pb);


    return 0;
}
int fun(int num)
{
    return num;
}
void swap(int *a,int *b)
{
    int temp=*a;
    *a=*b;
    *b=temp;
}

Copyright © Linux教程網 All Rights Reserved