关于指针和加减法:
指针的加减法:指针的加减法,加多少或者减多少,主要是看所指对象的sizeof值。
例子:
double m = 3.0; int n = 3; double *p=&m; int* p1=&n; printf("p:%d ", p ); printf("P+1:%d ", p+1); printf("P1:%d ", p1); printf("P1+1:%d ", p1+1);
如上图所示,p加了8,因为指向是double类型。p1加了4,因为指向了int。
现在我定义一个数组,int a[3]={0};看一下a+1和&a+1到底加了多少:
int p[3] = { 0 }; printf("p:%d ", p); printf("P+1:%d ", p + 1); printf("&p:%d ", &p); printf("&p+1:%d ", &p+1);
p+1加了4,&p+1加了12。
此时p指向的是数组的第一个元素,而&p指向的一个大小为3的int数组。因此p+1加的是一个int的大小,而&p+1加的是一个int[3]数组的大小12。
关于类型和sizeof:
虽然如此,但是p的类型是数组,&p的类型是指针。而sizeof的值主要是根据变量类型判断的。
int (*p1)[3]=&p;
p1和&p的类型都是指向int [3]的指针,而p的类型就是一个int[3]的数组。PS:数组在作为参数的时候退化为一个指针。
而sizeof主要是根据变量的类型,因此指针大小自然为4,p的大小是12。