C語言--指針詳解1

一,指針
    1.地址
        內存單元的編號叫地址;
    2.指針
        內存單元的地址叫指針;
        變量的地址叫指針;
    3.指針變量
        存儲變量地址的變量叫指針變量;
        
    說明:
        在不作區分的情況下,將地址指針指針變量統稱指針;
    4.指針變量的形式
        存儲類型數據類型*指針變量名;
        例如:
            int * p;
        說明:
            存儲類型:同普通變量,指針變量本身的存儲類型;
            數據類型:既可以是基本類型,也可以是struct,也可以是void,還可以是指針;
                      此數據類型是指針指向空間內容的數據類型;(重點)
            *:表示變量爲指針變量;
            指針變量名:符合命名規則;
    指針變量的初始化
        存儲類型數據類型*指針變量名=地址值; eg1
        
        :
            int i = 10;
            int * p =&i; //由於p指針指向的數據爲int型,所以需要給指針變量putr int型變量的地址; eg2
        
        :
            char ch ='a';
            char * q =&ch;
    6.&與*
        &:取變量的地址
        *:
            1>在定義指針變量時,*用來說明定義的變量爲指針變量;
                例如:
                    float * p; // *說明定義的變量p爲指針變量;
            2>在定義之後,指針變量名前加*,含義是取指針指向空間的值;(解引用)
                例如:
                    int i = 10;
                    int * p;
                    p =&i; //給指針變量p賦i的地址
                    printf(“i =%d * p =%d \ n”,i,* p);
    注意:
        &與*互爲逆運算;
        例如:
            int i = 10;
            的printf(”
            
    7.指針的運算
        本質:地址的運算
        定義指針變量px和py;
        
        1>算數運算:(+ - ++ - )
            px + n:指針向地址大的方向偏移n個數據類型;(此數據類型爲指針指向內容的數據類型)
            px-n:指針向地址小的方向偏移n個數據類型;(此數據類型爲指針指向內容的數據類型)
            px ++://等價:px = px + 1;指針向地址大的方向移動1個數據類型;(此數據類型爲指針指向內容的數據類型)
            px--:指針向地址小的方向移動1個數據類型;(此數據類型爲指針指向內容的數據類型
            PX-PY:兩指針之間相差的數據類型的個數;
            
            
            例如:
                int a [10] = {1,2,3,4,5,6,7,8,9,10};
                int * p =&a [0]; //
                int * q =&a [7];
                printf(“p =%p p + 3 =%p \ n”,p,p + 3); // p = 0xbffb8334 p + 3 = 0xbffb8340
                printf(“q =%p q-3 =%p \ n” ,q,q-3); // q = 0xbffb8350 q-3 = 0xbffb8344
                printf(“qp =%d \ n”,qp); // qp = 7
                    
            注意:
                n爲整數
        2>關係運算(> <> = <= ==!=)
            eg1:
                int * p; //“野指針“
                * p = 10; //不允許通過野指針訪問野指針指向的空間; eg2
                    
            :
                int * p = NULL; // stdio.h定義的宏值#define NULL 0
                if(NULL == p)/ /判斷指針是否爲有效的指針
                {
                    return;
                }
                
                * p = 10; //錯誤
        3>賦值運算eg1
            :
                int i = 10;
                int * p =&i;
            eg2:
                int i = 10;

                int * q = p;
            eg3:
                int a [10];
                int * p = a;
二,指針與數組
    通過指針操作數組;
    1,一級指針與一維數組
        例如:
            int a [10] = {1,2,3,4,5,6,7,8, 9,10};
            int * p = a; // int * p =&a [0];
            int i;
            for(i = 0; i <10; i ++)
                printf(“%d”,a [i]);
            的printf( “\ n”);
            
            for(i = 0; i <10; i ++)
                printf(“%d”,p [i]);
            printf(“\ n”);
    結論:
        1> 數組中第i個元素的表示:(i = 0,1,2,.....)
            a [i] p [i] *(a + i) *(p + i)*(&a [i])*(&p [i])
        2>
            &a [i]&p [i](a + i)(p + i)         
三,        字符指針
    1.形式
存儲類型char *指針變量名; eg1
        :
            char ch ='a';
            char * p =&ch; //
            * p ='b';
            的printf( “* P =%C \ n”,* P);
        eg2:
            字符指針操作字符串(重點)char * p =“hello world”; //將字符串的首地址賦予p指針
            printf(“* p =%c \ n”,* p); // * p ='h'
            * p ='a'; // ERROR不能通過指針修改常量區的東西
        例子:
            char * p;
            p =“你好世界”;
            printf(“* p =%c \ n”,* p); // * p ='
            h'printf(“p =%s \ n”,p);

            

            char * p = NULL;
            p =“你好世界”;
        eg4:
            char ch [20] =“hello world”;(√)
            char ch1 [20];
            ch1 =“hello world”;(×)//數組名不能作爲左值
        eg5:
            char ch1 [20];
            ch1 [20] =“hello world”;(×)// ch1 [20]表示的是數組ch1中的第21個元素,越界
        eg6:
            char ch [20] =“hello world”; //將常量區的“hello world”拷貝貝份到ch的空間
            * ch ='a';
            printf(“%s \ n”,ch); //結果:aello world
    

實例:
    1,求一個字符串的長度。(指針) 

    的#include <stdio.h>中

    int main()
    {
        char ch [64];
        得到(CH);

        int num=0;
        char *p = ch;

        while(*p != '\0')
        {
            num++;
            p++;
        }

        printf("num=%d\n",num);

        return 0;
    }

    2、計算一個字符串的空格數,並刪除全部空格;
    
    #include<stdio.h>

    int main()
    {
        char a[64];
        gets(a);

        int i,j,num=0;
        for(i=0;a[i]!='\0';i++)
        {
            if(a[i] == ' ')
            {
                num++;
                for(j=i;a[j]!='\0';j++)
                    a[j] = a[j+1];
                i--;
            }
        }
        
        printf("num=%d %s\n",num, a);

        return 0;
    }

    3、用指針給一個數組賦值,並打印。
    
    #include<stdio.h>

    int main()
    {
        int a[10];
        int len = sizeof(a) / sizeof(int);
        int *p = a;
        int i;
        for(i=0;i<len;i++)
            scanf("%d",p++);
        p = a;

        for(i = 0; i <len; i ++)
            printf(“%d”,p [i]);
        的printf( “\ n”);

        返回0;
    }        
            
            
            
            
        

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