(*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
这个才是咱们想要的结果!