指針是一種數(shù)據(jù)類型
數(shù)據(jù)類型有哪些特性?
1、作為參數(shù)傳值;
2、作為函數(shù)的返回值;
3、聲明成變量;
為什么要聲明數(shù)據(jù)類型?
為了更加合理的分配內(nèi)存空間。
直接引用
1.如我們在代碼中寫下:char a =10;
2.看上去挺簡單的,但是在程序內(nèi)部是怎么實現(xiàn)的呢?
程序?qū)ψ兞康淖x寫操作,實際是對變量所在的存儲空間進行讀寫操作。所以上面的代碼我們就可以這樣理解:
系統(tǒng)將變量名a轉(zhuǎn)化為變量的存儲地址,根據(jù)地址找到變量a的存儲空間,然后將數(shù)據(jù)10以二進制的形式放到
變量a的存儲空間。
變量 ? ? ? ? ? ? ? ?地址 ? ? ? ? ? ? 存儲內(nèi)容
? a ? ------- ?xxxx ? ? ? ? ?0000 1010
3.通過變量名引用變量,由系統(tǒng)來完成變量名和存儲地址之間的轉(zhuǎn)換,稱為變量的“直接引用”方式
一、什么是指針?
1.“直接引用”是直接通過變量名來讀寫變量。
2.C語言中還有一種“間接引用”的方式 例如:首先將變量a的地址存放在另一個變量中,比如存放在變量b中,然后通過變量b來間接引用變量a,間接讀寫變量a的值。這就是"間接引用"。
3.指針變量占用的空間和它所指向的變量類型無關(guān),只跟編譯器位數(shù)有關(guān)(準確的說只跟尋址方式有關(guān));
變量 ? ?地址 ? ? ?存儲內(nèi)容
?a ? ? ? xxxa ? ??
?b ? ? ? xxxb ? ? ? xxxa
3.總結(jié):用來存放變量地址的變量,就成為“指針變量”。上面的情況b就是一個指針變量,就是指針變量b指向變量a。
二、指針的定義
一般的形式:類型 ?*指針變量名;int *p; ?float *q;
· “*”是一個說明符,用來說明這個變量是一個指針變量,它不屬于變量名的一部分;
· 前面的類型表示指針變量指向的類型,并且只能指向這種類型。
三、指針的初始化
int a; //定義int類型的變量a
int *p = &a;//定義一個指針變量p,將變量a的地址賦值給指針變量p,所以指針變量p指向變量a
指針是用來存地址的?
int *p;?
p = 200;//這是錯誤的
四、指針運算符
1.給指針指向的變量賦值
char a = 10;
printf("修改前,a的值:%d\n", a);
// 指針變量p指向變量a?
char *p = &a;//這個“*”只是用來說明p是個指針變量
// 通過指針變量p間接修改變量a的值
*p = 9;//這個“*”是個指針運算符,這里的*p代表根據(jù)p值(存放的變量a的地址)訪問對應(yīng)的存儲空間,
這里的存儲空間也就是變量a的存儲空間。所以就將9寫入到存儲空間,所以輸出結(jié)果為
printf("修改后,a的值:%d", a); ? 修改前a的值:10 ?修改后a的值:9
2.取出指針所指向變量的值
指針運算符除了可以賦值之外,還可以用于取值
char a = 10;
char *p;
p = &a;
char value = *p;
printf("取出a的值:%d", value); ? ? 取出a的值:10;
3.注意點
在指針變量沒有指向確定的地址前,不要對它的內(nèi)容賦值。
int *p; *p = 10;///這是錯誤的
應(yīng)該在指針變量指向一個確定的變量后再進行賦值。
int i = 6, j;
int *p;
p = &j;
*p = i;
五、指針的用途
現(xiàn)在有個要求:寫一個函數(shù)swap,接收2個整型參數(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;
}