指針的小總結1

 
本人在學C語言時,發覺指針很難搞,於是作了幾點總結
一.概念區分:
1) 指針和指針變量:
指針:一個變量的地址稱爲該變量的指針。
指針變量:一個變量專門存放另一個變量的地址。(地址是以八進制數保存的 %o)
      2)*p++與*(p++):二者相同,先得到p指向變量的值,後再加加。
  (*p)++與*p++:前者相當於(a[0])++,即a++。後者同上。
   *(p++)與*(++p):後者是先使指針加一,然後再取值。
3) ++*p與(*p)++:前者是++a,後者是a++
    ++*p與*p++:
    (*p)++與*p++
4)實參數組名與形參數組名:
   數組名做實參時,代表一個固定的地址(指針常量),但形參數組並不是一個固定的地址值(指針變量)。
5)[ ]是變址運算符:將a[i]先按a+i計算地址,然後找出地址單元的值。
6) int *p;int *p[ ]; int (*p)[ ]; int *p( ); int (*p)( ); int **p的概念區分:
  ①int (*p)():指向函數的指針
    eg: int max(int, int);
        int (*p)(int,int);
p=max; /*將函數max的入口地址賦給指針變量p,函數名代表該函數的
        c=(*p)(a,b); 入口地址*/
應用:把指針作爲參數傳遞到其他函數,這樣就能夠在被調用的函數中使用實參函數。
二.數組與指針
1)一維數組與指針:
   p=a;&a[0]
  數組元素地址:
   1.p+i = a+i
   2.&p[i]=&a[i]
   數組元素引用
   1.*(p+i)=*(a+i)
   2.p[i]=a[i]
2)二維數組與指針:
   定義
   int a[3][4]={{1,2,3,4},{9,11,13,15},{17,19,21,23}}
   a是一個數組名。a數組包括3行,即3個元素:a[0],a[1],a[2].而每一個元素又是一個一維數組。因此a代表的是首行首地址。由於a[0],a[1],a[2]又是一維數組名,C語言規定數組名代表數組首元素地址。—— a[0]代表一維數組a[0]中第0列元素的地址,即&a[0][0].
表示形式
含義
a ,&a[0]
二維數組名,指向一維數組a[0],即0行首地址
a[0],*(a+0),*a,&a[0][0]
0行0列首地址
a+1,&a[1]
1行首地址
a[1],*(a+1),&a[1][0]
1行0列元素的地址
a[1]+2,*(a+1)+2,&a[1][2]
1行2列元素的地址
*(a[1]+2),*(*(a+1)+2),a[1][2],(*(a+1))[2]
1行2列元素
**(a+1)
1行元素
a+i ,&a[i]
i行地址
a[i], *(a+i)
i行0列地址
a[i]+j, *(a+i)+j
i行j列地址
指針賦值
p指向數組元素:
 int *p;
 p=&a[0][0];
 p=a[0];
 p=*a;
p=*(a+0);
② p是行指針:
   int (*p) [n];
   p=a;
          p=&a[0];
       數組地址表示法:
       數組元素表示法
三.經典概念程序題:

a)         指針做函數參數:swap()
1)                                                                                                                                                            
#include <stdio.h>                                                          
void swap(int *x, int *y)                       結果:5,3
{  
int t;
    t = *x;
    *x = *y;                     //指針所指向的變量的內容發生交換
*y = t;
}
void main ()
{
      int a=3,b=5;
      swap(&a, &b);
printf(“%d,%d”,a,b);
}
      2)
         #include <stdio.h>
void swap(int *x, int *y)                       結果:3,5
{  
int *t;
    t = x;
x = y;                     //地址值進行交換,由於地址也是形參,所以返回     
y = t;                      //主函數時,空間被釋放,而沒有交換a,b值。
}
void main ()
{
      int a=3,b=5;
      swap(&a, &b);
printf(“%d,%d”,a,b);
}
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章