1. 程式人生 > >C語言—————指標細論【1】

C語言—————指標細論【1】

一、指標     1.地址         記憶體單元的編號叫地址;     2.指標         記憶體單元的地址叫指標;         變數的地址叫指標;     3.指標變數         儲存變數地址的變數叫指標變數;              說明:         在不作區分的情況下,將地址 指標 指標變數統稱指標;     4.指標變數的形式         儲存型別 資料型別 *指標變數名;         eg:             int *p;         說明:             儲存型別:同普通變數,指標變數本身的儲存型別;             資料型別:既可以是基本型別,也可以是struct,也可以是void,還可以是指標;                       此資料型別是指標指向空間內容的資料型別;(重點)             *:表示變數為指標變數;             指標變數名:符合命名規則;     5.指標變數的初始化         儲存型別 資料型別 *指標變數名 = 地址值;                  eg1:             int i = 10;             int *p = &i;//由於p指標指向的資料為int 型,所以需要給指標變數p賦int型變數的地址;                  eg2:             char ch = 'a';             char *q = &ch;     6.& 與 *         &:取變數的地址         *:             1> 在定義指標變數時,*用來說明定義的變數為指標變數;                 eg:                     float *p;//*說明定義的變數p為指標變數;             2> 在定義之後,指標變數名前加*,含義是取指標指向空間的值;(解引用)                 eg:                     int i = 10;                     int *p;                     p = &i;//給指標變數p賦i的地址                     printf("i=%d *p=%d\n",i, *p);     注意:         & 與 *互為逆運算;         eg:             int i = 10;             printf("%d\n",*(&i));//結果10                  7.指標的運算         本質:地址的運算         定義指標變數 px和py;                  1> 算數運算:(+  -  ++  --)             px+n:指標向地址大的方向偏移n個數據型別;(此資料型別為指標指向內容的資料型別)             px-n:指標向地址小的方向偏移n個數據型別;(此資料型別為指標指向內容的資料型別)             px++://等價:px=px+1;指標向地址大的方向移動1個數據型別;(此資料型別為指標指向內容的資料型別)             px--:指標向地址小的方向移動1個數據型別;(此資料型別為指標指向內容的資料型別)             px-py:兩指標之間相差的資料型別的個數;                                       eg:                 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("q-p=%d\n",q-p);//q-p=7                                  注意:                 n為整數         2> 關係運算(>  <  >=  <=  ==  !=)             eg1:                 int *p;//"野指標"                 *p = 10;//不允許通過野指標訪問野指標指向的空間;                                  eg2:                 int *p = NULL;//stdio.h定義的巨集值  #define NULL  0                 if(NULL == p)//判斷指標是否為有效的指標                 {                     return ;                 }                                  *p = 10;//ERROR         3> 賦值運算             eg1:                 int i = 10;                 int *p = &i;             eg2:                 int i = 10;                 int *p = &i;                 int *q = p;             eg3:                 int a[10];                 int *p = a; 二、指標與陣列     通過指標運算元組;     1、一級指標與一維陣列         eg:             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> 陣列中第i個元素的地址的表示:(i=0,1,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="hello world";             printf("*p=%c\n",*p);//*p='h'             printf("p=%s\n",p);//p=hello world             printf("*p=%p\n",*p);//p=0x80484f0"字串首地址"                      eg3:字元指標的賦值                         char *p = NULL;             p = "hello world";         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];         gets(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");

        return 0;     }