一辅辩、什么是指針难礼?
指針在百度的解釋:是編程語言中的一個(gè)對(duì)象,利用地址玫锋,它的值直接指向(points to)存在電腦存儲(chǔ)器中另一個(gè)地方的值蛾茉。
也就是說,指針是用于指向某一內(nèi)存單元撩鹿。
簡而化之谦炬,指針便是地址。
二节沦、聲明指針
1.方法:數(shù)據(jù)類型 *名稱 初始化
2.例如:
int *p=&a //其中int是數(shù)據(jù)類型键思,p是指針變量的名稱,=&a是對(duì)指針變量p的初始化
3.注意:指針聲明完一定要初始化甫贯,否則就會(huì)變成野指針(沒有指向的目標(biāo))吼鳞;而且指針初始化時(shí)只能指向地址,不能指向數(shù)據(jù)(在*與&中會(huì)講到)叫搁。
三赔桌、使用指針
指針也是一種變量,對(duì)于指針的使用方法和對(duì)其他變量的用法一致常熙。
野指針和空指針不同纬乍,如果對(duì)野指針進(jìn)行使用碱茁,程序?qū)?huì)報(bào)錯(cuò)裸卫。
四、*和&
1.*:有兩個(gè)作用纽竣,一是在聲明變量是墓贿,用來標(biāo)識(shí)這個(gè)變量是指針變量茧泪;二是在其他地方作用于指針時(shí),代表取值聋袋,即p就取指針p所指向的值队伟。
(在是聲明時(shí),作聲明符幽勒,是一種作用嗜侮;在其他地方作用于指針時(shí),做單目運(yùn)算符啥容,又是另一種作用锈颗;還有一種情況,表示雙目運(yùn)算符咪惠,即為乘積的意思击吱,如5*5=25)
2.&:是取地址運(yùn)算符,例如&a遥昧,就是變量a的地址覆醇。
五、一個(gè)案例看懂指針
#include<stdio.h>
int main(void)
{ int a=10; //聲明一個(gè)變量a炭臭,它的值為10
int *p=&a; //聲明一個(gè)指針變量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.作用:聲明一個(gè)指針后鞋仍,如果暫不使用憨奸,可以先給它賦值為NULL,避免其成為野指針凿试。
2.方法:指針名=(數(shù)據(jù)類型*)malloc(你分配的內(nèi)存大小)
3.例如:
int *p;
p=(int*)malloc(4);//分配動(dòng)態(tài)內(nèi)存
4.注意:malloc的數(shù)據(jù)類型要和指針的數(shù)據(jù)類型一致排宰;
內(nèi)存分配后,習(xí)慣上都會(huì)進(jìn)行判斷是否分配成功那婉,不成功則退出程序板甘;
內(nèi)存分配使用完之后一定要釋放掉,free是釋放函數(shù)详炬,所以malloc和free必須是成對(duì)出現(xiàn)的盐类。
5.案例:
#include<stdio.h> #include<stdlib.h> //malloc函數(shù)和free函數(shù)存儲(chǔ)在stdiib.h這個(gè)函數(shù)庫里
int main(void)
{ int *p;
p=(int*)malloc(4);//分配動(dòng)態(tài)內(nèi)存
if(p==NULL)
{
printf("內(nèi)存分配失敗。\n");
exit(-1);//退出
} *p=100;
printf("p指針中的內(nèi)容=%d\n",*p); free(p);//內(nèi)存釋放
return 0;
}
七呛谜、雙級(jí)指針
雙級(jí)指針就是指向指針的指針在跳,即:
int*p1=&a; //指針p1指向a的地址
int*p2=p1; //指針p2指向p1</pre>
例如:
#include<stdio.h>
int main(void)
{ int a=1; int *p1=&a; int *p2=p1;
printf("%d\n",*p2); //輸出指針p2所指向的指針p1所指向的變量a的值 return 0;
}
八、番外
注意看上一個(gè)案例隐岛,如果我們把p=(int)malloc(4)改為2猫妙,就會(huì)報(bào)錯(cuò),如下圖(這被稱為內(nèi)存越界*)聚凹。
這是為什么呢割坠,這就關(guān)乎到數(shù)據(jù)長度的問題了齐帚,因?yàn)樵赩C6.0出生時(shí),系統(tǒng)和CPU發(fā)展到32位彼哼,所以VC6.0是32位的編譯器对妄,在VC6.0中,int的數(shù)據(jù)長度為32/8=4字節(jié)敢朱;
而TC2.0出生時(shí)剪菱,系統(tǒng)和CPU還停留在16位,所以TC2.0是16位的編譯器拴签,在TC2.0中琅豆,int的數(shù)據(jù)長度為16/8=2字節(jié)。