一、什麼是指針?
指針在百度的解釋:是編程語言中的一個對象,利用地址,它的值直接指向(points to)存在電腦存儲器中另一個地方的值。
也就是說,指針是用於指向某一內存單元。
簡而化之,指針便是地址。
二、聲明指針
1.方法:數據類型 *名稱 初始化
2.例如:
int *p=&a //其中int是數據類型,p是指針變量的名稱,=&a是對指針變量p的初始化
3.注意:指針聲明完一定要初始化,否則就會變成野指針(沒有指向的目標);而且指針初始化時只能指向地址,不能指向數據(在*與&中會講到)。
三、使用指針
指針也是一種變量,對於指針的使用方法和對其他變量的用法一致。
野指針和空指針不同,如果對野指針進行使用,程序將會報錯。
四、*和&
1.*:有兩個作用,一是在聲明變量是,用來標識這個變量是指針變量;二是在其他地方作用於指針時,*代表取值,即*p就取指針p所指向的值。
(*在是聲明時,作聲明符,是一種作用;在其他地方作用於指針時,做單目運算符,又是另一種作用;還有一種情況,*表示雙目運算符,即為乘積的意思,如5*5=25)
2.&:是取地址運算符,例如&a,就是變量a的地址。
五、一個案例看懂指針
#include<stdio.h> int main(void) { int a=10; //聲明一個變量a,它的值為10 int *p=&a; //聲明一個指針變量p,它的值為變量a的地址 printf("a的值為%d\n",a); //輸出a printf("a的值為%d\n",*p); //輸出p所指向的值 printf("a的地址為%d\n",p); //輸出a的地址 printf("a的地址為%d\n",&a); //輸出p的值 return 0; }
六、空指針
1.作用:聲明一個指針後,如果暫不使用,可以先給它賦值為NULL,避免其成為野指針。
2.方法:指針名=(數據類型*)malloc(你分配的內存大小)
3.例如:
int *p; p=(int*)malloc(4);//分配動態內存
4.注意:malloc的數據類型要和指針的數據類型一致;
內存分配後,習慣上都會進行判斷是否分配成功,不成功則退出程序;
內存分配使用完之後一定要釋放掉,free是釋放函數,所以malloc和free必須是成對出現的。
5.案例:
#include<stdio.h> #include<stdlib.h> //malloc函數和free函數存儲在stdiib.h這個函數庫裡 int main(void) { int *p; p=(int*)malloc(4);//分配動態內存 if(p==NULL) { printf("內存分配失敗。\n"); exit(-1);//退出 } *p=100; printf("p指針中的內容=%d\n",*p); free(p);//內存釋放 return 0; }
七、雙級指針
雙級指針就是指向指針的指針,即:
int*p1=&a; //指針p1指向a的地址 int*p2=p1; //指針p2指向p1
例如:
#include<stdio.h> int main(void) { int a=1; int *p1=&a; int *p2=p1; printf("%d\n",*p2); //輸出指針p2所指向的指針p1所指向的變量a的值 return 0; }
八、番外
注意看上一個案例,如果我們把p=(int*)malloc(4)改為2,就會報錯,如下圖(這被稱為內存越界)。
這是為什麼呢,這就關乎到數據長度的問題了,因為在VC6.0出生時,系統和CPU發展到32位,所以VC6.0是32位的編譯器,在VC6.0中,int的數據長度為32/8=4字節;
而TC2.0出生時,系統和CPU還停留在16位,所以TC2.0是16位的編譯器,在TC2.0中,int的數據長度為16/8=2字節。