實(shí)例1
#include <stdio.h>
int main(void)
{
int a = 23;
int *p; // 定義了一個(gè)int型的指針變量
p = &a; //相當(dāng)于p =(&a)秦士,p中存的是變量a的地址
*p = 111; //相當(dāng)于a = 111
printf("a=%d.\n", a);
pirntf("*p=%p.\n", p);
return 0;
}
知識(shí)點(diǎn):
(1)符號(hào)含義
符號(hào) | 含義 |
---|---|
a | 代表變量a本身 |
p | 代表指針變量p本身 |
&a | 代表變量a的地址值 |
*p | 代表指針變量品所指向的那個(gè)變量缺厉,也就是a |
int *p | 定義指針變量p |
%p | 用于打印指針變量的值 |
(2)指針定義的兩種理解
int *p*
第一種理解:首先看到p,這個(gè)是變量名伍宦,其次芽死,p前面有個(gè),說(shuō)明這個(gè)變量p是一個(gè)指針變量次洼,最后关贵,p前面有一個(gè)int,說(shuō)明這個(gè)指針變量p所指向的是一個(gè)int型數(shù)據(jù)卖毁。(推薦揖曾,符合編譯器設(shè)計(jì)思維)
第二種理解:首先看到p,這個(gè)是個(gè)變量名炭剪,其次练链,看到p前面的int *,把int *當(dāng)作一個(gè)整體來(lái)理解奴拦,int *是一種符合類(lèi)型媒鼓。該類(lèi)型表示一種指向int型數(shù)據(jù)的指針。
實(shí)例2
#include <stdio.h>
int main(void)
{
int a[5] = {555, 444, 333, 222, 111};
int *p;
//p = &a; //編譯報(bào)警告错妖,但是執(zhí)行結(jié)果是對(duì)的绿鸣,555。
//p = &a[0]; //相當(dāng)于p = &(a[0]);編譯沒(méi)錯(cuò)也沒(méi)警告暂氯,執(zhí)行也沒(méi)錯(cuò)潮模,555
p = a; //編譯沒(méi)錯(cuò)也沒(méi)警告,執(zhí)行也沒(méi)錯(cuò)痴施,555
printf("*p = %d.\n", *p);
//a = p; //編譯報(bào)錯(cuò)擎厢,因?yàn)閿?shù)組名是個(gè)常量,所以不能賦值辣吃,所以數(shù)組名不能做左值动遭。
return 0;
}
知識(shí)點(diǎn):
(1)數(shù)組名與&a
數(shù)組名a做右值時(shí),數(shù)組名表示數(shù)組首元素的首地址齿尽,所以可以直接賦值給指針沽损。&a表示數(shù)組的首地址。數(shù)組首元素的首地址和數(shù)組的首地址是不同的循头。前者是數(shù)組元素的地址绵估,后者是數(shù)組整體的地址。兩個(gè)東西的含義不同卡骂,但數(shù)值上是相同的国裳。
(2)訪(fǎng)問(wèn)數(shù)組兩種方式
數(shù)組的方式依次訪(fǎng)問(wèn):a[0]、a[1]全跨、a[2]缝左、a[3]、a[4]
指針的方式依次訪(fǎng)問(wèn):p浓若、(p+1)渺杉、(p+2)、(p+3)挪钓、(p+4)
因?yàn)閜的訪(fǎng)問(wèn)方式已經(jīng)確定是以幾個(gè)字節(jié)幾個(gè)字節(jié)去訪(fǎng)問(wèn)的是越。
(3)指針與++、--符號(hào)進(jìn)行運(yùn)算
指針本身也是一種變量碌上,因此也可以進(jìn)行運(yùn)算倚评,但是因?yàn)橹羔樧兞勘旧泶娴氖瞧渌兞康牡刂菲只玻虼嗽撝颠M(jìn)行、/天梧、%等運(yùn)算是無(wú)意義的盔性。兩個(gè)指針相加本身也是無(wú)意義的,相減有意義呢岗。指針變量+1冕香、-1是有意義的。+1代表指針?biāo)赶虻母褡酉蚝笈惨桓瘢?1代表指針?biāo)赶虻母褡酉蚯芭惨桓瘛?br>
(4)p++敷燎、++p暂筝、(p)++、++(p)
++先跟p結(jié)合硬贯,但是因?yàn)?+后置的時(shí)候,本身含義就是先運(yùn)算后增加1(運(yùn)算指的是p++整體與前面的進(jìn)行運(yùn)算陨收;增加1指的是p+1)饭豹,所以實(shí)際上p++符號(hào)整體對(duì)外表現(xiàn)的是p的值,運(yùn)算完成后p再加1务漩。
所以p++等同于:p拄衰; p += 1;
++p,等同于p += 1; p;
(p)++饵骨,使用()強(qiáng)制將與p結(jié)合翘悉,只能先計(jì)算p,然后值加1居触。
++(*p)妖混,值加1,再代入運(yùn)算轮洋。
--與++類(lèi)似制市。
實(shí)例3
不改變實(shí)參
int add(int a,int b)
函數(shù)傳參使用了int型數(shù)弊予,本身是數(shù)值類(lèi)型祥楣,實(shí)際調(diào)用該函數(shù)時(shí),實(shí)參將自己拷貝一份汉柒,并將拷貝傳遞給形參進(jìn)行運(yùn)算误褪。實(shí)參自己實(shí)際是不參與的。所以碾褂,在函數(shù)中兽间,是沒(méi)辦法改變實(shí)參本身的。
改變實(shí)參
經(jīng)典例子——交換兩個(gè)數(shù)的值
#include <stdio.h>
int main(void)
{
int x,y;
x = 5;
y = 3;
printf("before swap:x = %d, y = %d.\n", x,y);
swap_pointer(&x, &y);
printf("after swap:x = %d, y = %d.\n", x,y);
}
int swap_pointer(int *p1, int *p2)
{
int temp;
temp = *p1; //實(shí)際調(diào)用時(shí)斋扰,p1得到的實(shí)參是x的地址&x渡八,*p1代表的就是x
*p1 = *p2;
*p2 = temp;
return 0;
}