指針變量的本質是用來放地址,而一般的變量是放數值的。
1、指針的定義(兩種形式)
①int x=3; int *p=&x
②int x; int *p;
x=3;p=&x
int*p中????????*p和p的差別:簡單說*p是數值,p是地址!
*p可以當做變量來用;*的作用是取后面地址p里面的數值
p是當作地址來使用。可以用在scanf函數中:scanf("%d”,p);
2、*p++ 和(*p)++的之間的差別:改錯題目中很重要!考試超級重點
*p++是 地址會變化。? ? ? ? ? 口訣:取當前值,然后再移動地址!
(*p)++是數值會要變化。口訣:取當前值,然后再使數值增加1。
經典例題
int *p, a[]={1,3,5,7,9};
p=a;
請問*p++和(*p)++的數值分別為多少?
*p++:這個本身的數值為1。由于是地址會增加一,所以指針指向數值3了。
(*p)++這個本身的數值為1。由于有個++表示數值會增加,指針不移動,
但數值1由于自加了一次變成了2。
3、二級指針:
*p:一級指針:存放變量的地址。
**q:二級指針:存放一級指針的地址。
常考題目:
int x=7;
int*p=&x,**q=p;
問: *p為多少?*q為多少?**q為多少?
????????????????7????????????????p????????????????7
再問:**q=&x的寫法可以嗎?
不可以,因為二級指針只能存放一級指針的地址。
4、三名主義(考試的重點)
數組名:表示第一個元素的地址。數組名不可以自加,他是地址常量名。
函數名:表示該函數的入口地址。
字符串常量名:表示第一個字符的地址。
5、移動指針(經常加入到考試中其他題目綜合考試)
char *s= "meikanshu"
while(*s){printf ("%c",*s); s++; }
這個s首先會指向第一個字母m然后通過循環會一次打印出一個字符,s++是地址移動,打印了一個字母后,就會移動到下一個字母!
6、指針變量兩種初始化
方法一:int a=2, *p=&a;(定義的同時初始化)
方法二:int a=2,*p;(定義之后初始化)
??????????????p=&a;