數據類型
見下表
定義 | 含義 |
int i; | 定義整型變數i。 |
int *p; | p為指向整型變數的指針變數。 |
int a[n]; | 定義整型數組a他有n個元素。 |
int *p[n]; | 定義指針數組p,它由n個指向整型數據的指針元素組成。 |
int (*p)[n]; | p為指向含n個元素的一維數組的指針變數。 |
int f(); | f為帶回整型函式值的函式。 |
int *p(); | p為帶回一個指針的函式,該指針指向整型數據。 |
int (*p); | p為指向函式的指針,該函式返回一個整型值。 |
int **p; | p是一個指針變數,它指向一個指向整型數據的指針變數。 |
指針運算小結
1、指針變數加減一個整數
如:p++ p-- p+i p-i p+=i p-=i 等
實際含義如 p+i 代表地址計算: p+c*i , c為位元組數,整型c=2、
實型c=4、字元型c=1。
值得注意的是:P++(或P--)所表示的是指針方向發生了改變而P+i(或P-i)表示的是指針方向不發生改變。
2、指針變數賦值
如:p=&a a為變數,p為指針變數
p=array array為數組名
p=&array
p=max max為函式名
p1=p2 p2為指針變數
注意:不能把一個整數或常數賦給p,如p=1000 同樣也不能把p賦給整型變數,如i=p
3、指針變數可以賦空值
如: p=NULL; 實際NULL是整數0。
4、兩個指針變數可以相減如兩個指針變數指向同一個數組的元素(右圖),
則 p2-p1=4-1=3但p1+p2無意義。
5、兩個指針變數比較
若兩個指針指向同一個數組的元素,則可以比較,
如: p1<p2 p1>p2
三、空類型指針
ANSI新標準增加了一種空類型指針,定義的一般形式為:
void * 變數名
具體使用時要做類型轉換,如:
void *p; (int *)p;
指針使用方法
1、在使用指針時,必須進行初始化,如果沒有直接所指示對像可以將指針變數指向NULL;
例如: int *p = NULL;
2、在指針使用完後,指針所指向的內在空間已經被釋放,則指針應該指向NULL,否則會出現游離狀態,這樣的指針對整個程式都有一定的威脅;
例如:
int *p = NULL;
p = (int *)malloc(sizeof(int));
if(NULL == p)
{
return -1;
}
所申請的記憶體用完並被釋放後,需要將所指向的指針指向NULL;即 p = NULL;
3、可以使用指針引用結構體成員變數,使用方法是:
typedef struct
{
int a;
int b;
}TEST_S;
TEST_S test;
int main(void)
{
TEST_S *pTest = NULL;
pTest = &test;
pTest->a = 10;
pTest->b = 20;
return 0;
}
在使用結構體指針時,首先應將結構體指針指向結構體,只有指針指向結構體後,才可以使用指針引用結構體中的成員變數,可以實現對結構中的成員變數進行賦值、完成相應運算。
4、指針變數做函式參數
例如:
void _Test_Swp(int *p, int *q)
{
int swp;
swp = *p;
*p = *q;
*q =swp;
}
main()
{
int *q = NULL;
int *p = NULL;
int a= 10;
int b = 20;
p = &a;
q = &b;
_Test_Swp(p, q);
printf("%d, %d\n", a, b);
}
該函式可以實現兩個整型數的調換,其中p、q就是做為函式的參數進行傳遞的;