**p
是一个指向指针的指针,它指向一个指针变量,而*p
是一个指向某个变量的指针。因此,(**p)++
会改变指针变量的值,而(*p)++
只会改变指针指向的变量的值。
*p+1
表示指针p指向的变量的地址加1;(*p)+1
表示指针p指向的变量的值加1;(**p)+1
表示指针p指向的指针变量的值加1;*(*p)+1
表示指针p指向的指针变量指向的变量的值加1。*(*p+1)
表示指针p指向的变量的地址加1后指向的变量的值。
**p+1
表示指针p指向的变量的地址加上1,即指向下一个变量的地址,而*p+1
表示指针p指向的变量的值加上1,即指向下一个变量的值。
*p++
表示先取出指针p指向的变量的值,然后指针p指向下一个变量;而++*p
表示先将指针p指向的变量的值加1,然后取出指针p指向的变量的值,不改变p指向的地址。
int a;
表示一个内存空间,这个空间用来存放一个整数(int);
int* a;
表示一个内存空间,这个空间用来存放一个指针,
这个指针指向一个存放整数的空间,即a)中提到的空间;
int** a;
表示一个内存空间,这个空间用来存放一个指针,
这个指针指向一个存放指针的空间,并且指向的这个空间中的指针,指向一个整数。
简单的说,指向了一个b)中提到的空间;
int (*a)[4];
表示一个内存空间,这个空间用来存放一个指针,
这个指针指向一个长度为4、类型为int的数组;
和int** a的区别在于,++、+=1之后的结果不一样,其他用法基本相同。
以上四种类型见上图表示。
int (*a)(int);
表示一个内存空间,这个空间用来存放一个指针,
这个指针指向一个函数,这个函数有一个类型为int的参数,并且函数的返回类型也是int。
int i;
int *a = &i; //这里a是一个指针,它指向变量i
int &b = i; //这里b是一个引用,它是变量i的引用(别名)
int * &c = a; //这里c是一个引用,它是指针a的引用
int **d = a; //d是一个指向指针a的指针;
int** &e= d; //e是一个引用,他是指向指针a的指针的引用
int & *d; //这里d是一个指针,它指向引用,但引用不是实体,所以这是错误的
int *p[] //指针数组
int (*p)[] //指向数组的指针
int &a; //只声明而不初始化是错误的,因为引用就是一个别名,
//如果不指明它是谁的别名,则会报错
//引用必须初始化,引用初始化就是将引用绑定到一个变量上。
版权声明:本文为weixin_56462041原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。