指針是一種數(shù)據(jù)類(lèi)型
數(shù)據(jù)類(lèi)型有哪些特性假残?
1缭贡、作為參數(shù)傳值;
2辉懒、作為函數(shù)的返回值阳惹;
3、聲明成變量眶俩;
為什么要聲明數(shù)據(jù)類(lèi)型莹汤?
為了更加合理的分配內(nèi)存空間。
直接引用
1.如我們?cè)诖a中寫(xiě)下:char a =10;
2.看上去挺簡(jiǎn)單的颠印,但是在程序內(nèi)部是怎么實(shí)現(xiàn)的呢纲岭?
程序?qū)ψ兞康淖x寫(xiě)操作,實(shí)際是對(duì)變量所在的存儲(chǔ)空間進(jìn)行讀寫(xiě)操作线罕。所以上面的代碼我們就可以這樣理解:
系統(tǒng)將變量名a轉(zhuǎn)化為變量的存儲(chǔ)地址止潮,根據(jù)地址找到變量a的存儲(chǔ)空間,然后將數(shù)據(jù)10以二進(jìn)制的形式放到
變量a的存儲(chǔ)空間钞楼。
變量 ? ? ? ? ? ? ? ?地址 ? ? ? ? ? ? 存儲(chǔ)內(nèi)容
? a ? ------- ?xxxx ? ? ? ? ?0000 1010
3.通過(guò)變量名引用變量沽翔,由系統(tǒng)來(lái)完成變量名和存儲(chǔ)地址之間的轉(zhuǎn)換,稱為變量的“直接引用”方式
一、什么是指針仅偎?
1.“直接引用”是直接通過(guò)變量名來(lái)讀寫(xiě)變量。
2.C語(yǔ)言中還有一種“間接引用”的方式 例如:首先將變量a的地址存放在另一個(gè)變量中雳殊,比如存放在變量b中橘沥,然后通過(guò)變量b來(lái)間接引用變量a,間接讀寫(xiě)變量a的值夯秃。這就是"間接引用"座咆。
3.指針變量占用的空間和它所指向的變量類(lèi)型無(wú)關(guān),只跟編譯器位數(shù)有關(guān)(準(zhǔn)確的說(shuō)只跟尋址方式有關(guān))仓洼;
變量 ? ?地址 ? ? ?存儲(chǔ)內(nèi)容
?a ? ? ? xxxa ? ??
?b ? ? ? xxxb ? ? ? xxxa
3.總結(jié):用來(lái)存放變量地址的變量介陶,就成為“指針變量”。上面的情況b就是一個(gè)指針變量色建,就是指針變量b指向變量a哺呜。
二、指針的定義
一般的形式:類(lèi)型 ?*指針變量名箕戳;int *p某残; ?float *q;
· “*”是一個(gè)說(shuō)明符陵吸,用來(lái)說(shuō)明這個(gè)變量是一個(gè)指針變量玻墅,它不屬于變量名的一部分;
· 前面的類(lèi)型表示指針變量指向的類(lèi)型壮虫,并且只能指向這種類(lèi)型澳厢。
三、指針的初始化
int a; //定義int類(lèi)型的變量a
int *p = &a;//定義一個(gè)指針變量p,將變量a的地址賦值給指針變量p囚似,所以指針變量p指向變量a
指針是用來(lái)存地址的?
int *p;?
p = 200;//這是錯(cuò)誤的
四剩拢、指針運(yùn)算符
1.給指針指向的變量賦值
char a = 10;
printf("修改前,a的值:%d\n", a);
// 指針變量p指向變量a?
char *p = &a;//這個(gè)“*”只是用來(lái)說(shuō)明p是個(gè)指針變量
// 通過(guò)指針變量p間接修改變量a的值
*p = 9;//這個(gè)“*”是個(gè)指針運(yùn)算符谆构,這里的*p代表根據(jù)p值(存放的變量a的地址)訪問(wèn)對(duì)應(yīng)的存儲(chǔ)空間裸扶,
這里的存儲(chǔ)空間也就是變量a的存儲(chǔ)空間。所以就將9寫(xiě)入到存儲(chǔ)空間搬素,所以輸出結(jié)果為
printf("修改后呵晨,a的值:%d", a); ? 修改前a的值:10 ?修改后a的值:9
2.取出指針?biāo)赶蜃兞康闹?/b>
指針運(yùn)算符除了可以賦值之外,還可以用于取值
char a = 10;
char *p;
p = &a;
char value = *p;
printf("取出a的值:%d", value); ? ? 取出a的值:10熬尺;
3.注意點(diǎn)
在指針變量沒(méi)有指向確定的地址前摸屠,不要對(duì)它的內(nèi)容賦值。
int *p; *p = 10;///這是錯(cuò)誤的
應(yīng)該在指針變量指向一個(gè)確定的變量后再進(jìn)行賦值粱哼。
int i = 6, j;
int *p;
p = &j;
*p = i;
五季二、指針的用途
現(xiàn)在有個(gè)要求:寫(xiě)一個(gè)函數(shù)swap,接收2個(gè)整型參數(shù),功能是互換兩個(gè)實(shí)參的值
void swap(char *v1, char *v2) {
// 中間變量
char temp;
// 取出v1指向的變量的值
temp = *v1;
// 取出v2指向的變量的值胯舷,然后賦值給v1指向的變量
*v1 = *v2;
// 賦值給v2指向的變量
*v2 = temp;
}
int main()
{
char a = 10, b = 9;
printf("更換前:a=%d, b=%d\n", a, b);
swap(&a, &b);
printf("更換后:a=%d, b=%d", a, b);
return 0;
}