(*p)++:是數值會要變化。
口訣:取當前值,而後再使數值增長 1。算法
例題:int *p,a[]={1,3,5,7,9};
p=a;
請問*p++和(*p)++的數值分別爲多少?
*p++:這個自己的數值爲1。因爲是地址會增長一,因此指針指向數值3了。
(*p)++:這個自己的數值爲1。因爲++表示數值會增長,指針不移動,但數值1因爲自加了一次變成了2。數組
**q:二級指針:存放一級指針的地址。函數
常考題目:int x=7;int*p=&x,**q=p;
問你:*p 爲多少?*q爲多少?**q爲多少?
*p=7,*q=p,**q=7
再問:**q=&x 的寫法能夠嗎?不能夠,二級指針只能存放一級指針的地址。指針
char *ps = "HELLO"; sizeof(ps) = 4 //只是指針的大小,即 地址(整數類型佔4個字節) sizeof(*ps) = 1 //*ps+0表明數組第一個元素的大小,即ps[0] char as[8]; sizeof(as) = 8 //由於as的類型爲 char [8],這個大小的確是8 sizeof(*as) = 1 //*as+0表明數組第一個元素的大小,即as[0] char aa[8][9]; sizeof((char *)aa) = 4 //仍是 char * char arr[100] = "HELLO"; sizeof(arr) = 100 //和賦什麼值沒什麼關係,關鍵是"類型"是什麼 int func(char p[100]) { sizeof(p) = 4; /*C/C++中不能傳數組,只能傳指針,因此任何數組都會隱式轉成指針形式進行操做。*/ }
兩種重要的數組長度:
char a[]={‘a’,’b’,’c’}; 數組長度爲3,字符串長度不定(由於沒有'\0'結束符)。sizeof(a)爲3。
char a[5]={ ‘a’,’b’,’c’}; 數組長度爲5,字符串長度3。sizeof(a)爲5。
char a[]={'a','b','c'}; 這是一個字符數組,佔3個字節。
char a[]="abc" 則不一樣,它是一個字符串,最後還有一個'\0'結束符,佔4個字節。code
指針考點:
char ch[]=」iamhandsome」;
char *p=ch;
問你:*(p+2) 和 *p+2 的結果是多少?
*(p+2) = ‘m’ *p+2 = ‘k’遞歸
解析:
第一個是地址+2,因此取m;
第二個則是數值+2,即 ASCII碼值+2,ijk,因此取k。內存
問題:#define f(x)(x*x) 和 #define f(x) x*x 之間的差異。字符串
define是C語言中的宏定義關鍵字,其定義格式以下:get
#define [MacroName] [MacroValue]宏定義分爲普通宏定義和帶參數的宏定義編譯器
普通宏定義:#define PI (3.1415926)
帶參數的宏定義 (宏函數):#define max(a,b) ((a)>(b)? (a),(b))
注意:變量在宏中要用括號括起來。
由於,在C語言中define宏定義在編譯時,會被展開,進行「傻瓜式」替換,也稱爲「字面」替換,若是沒有括號有可能會產生歧義。
如:
int a,b,c,d,e; a=1;b=2;c=6;d=4; e=f(a+b) * f(c+d) ; //理論值e=9*100=900 #define f(x)(x*x) 替換結果爲:e=(a+b*a+b)*(c+d*c+d) = 5*34=170 #define f(x) x*x 替換結果爲:e=a+b*a+b*c+d*c+d=1+2+12+24+4=43 #define f(x) ((x)*(x)) 替換結果爲:e=( (a+b)*(a+b)*(c+d)*(c+d) )=3*3*10*10=900
這個纔是咱們想要的結果!