C/C++易错知识点记录(一)
-
用户自定义标识符由字母、数字和下划线组成,只能由字母或下划线开头.
-
指针问题:
例1:int **pp,*p,a=10,b=20; pp=&p; p=&a; p=&b; printf("%d,%d",*p,**pp)
pp = &p; pp中储存p的地址,就是指针p的地址
p = &a;p中储存a的地址,就是p指向a,*p=a=10;
p = &b;p中储存b的地址,就是p指向b,*p=b=20;
*pp = p
**pp = *p = b = 20例2:
int main() { int a[5] = { 1, 2, 3, 4, 5}; int *ptr = (int*)(&a + 1); printf("%d, %d", *(a + 1), *(ptr - 1)); return; }
&a + 1: 取数组a 的首地址,该地址的值加上sizeof(a) 的值,即&a + 5*sizeof(int),也就是下一个数组的首地址,显然当前指针已经越过了数组的界限。(int *)(&a+1): 则是把上一步计算出来的地址,强制转换为int * 类型,赋值给ptr。*(a+1): a,&a 的值是一样的,但意思不一样,a 是数组首元素的首地址,也就是a[0]的首地址,&a 是数组的首地址,a+1 是数组下一元素的首地址,即a[1]的首地址,&a+1 是下一个数组的首地址。所以输出2*(ptr-1): 因为ptr 是指向a[5],并且ptr 是int * 类型,所以*(ptr-1) 是指向a[4] ,输出5。
例3:
p++ :表示先访问p,然后p++;
(p)++: 表示先访问p,然后将*p的值++;p指针不变。 -
自增自减:
#include < stdio. h > int d = 1; void fun( int p ) { int d