c++指针总结
怎么判断数据类型
int p;
一个普通的整型类型
int *p;
先看 p
和 *
结合,说明 p
是一个指针,然后再与 int
结合,说明指针指向的内容是整型类型。所以 p
是一个指向整型类型的指针。
int p[3];
先看 p
与 []
结合,说明 p
是一个数组,然后再与 int
结合,说明数组中元素的类型是整型。所以 p
是一个由整型类型元素组成的数组。
int *p[3];
先看 p
与 []
结合,说明 p
是一个数组,然后与 *
结合,说明数组中的元素的类型是指针,最后再与 int
结合,说明指针指向的内容的类型的整型。所以 p
是一个由指向整型数据的指针组成的数组。
int (*p)[3];
先看 p
与 *
结合,说明 p
是一个指针,然后再与 []
结合,说明指针指向的内容是一个数组,最后和 int
结合,说明数组的元素是整型类型。所以 p
是一个指向由整型数据组成的数组的指针。
int **p;
先看 p
与 *
结合,说明 p
是一个指针,然后又和 *
结合,说明指针指向的元素还是一个指针,最后再与 int
结合,说明指向的类型的是整型。所以 p
是一个指向返回整型类型的指针的指针。平时最多也就会用到二级指针,更多级的指针极少使用。
int p(int);
先看 p
与 ()
结合,说明 p
是一个函数而且有一个整型变量作为参数,最后与 int
结合。所以 p
是一个返回值为整型且有一个整型变量参数的函数。
int (*p)(int);
先看 p
与 *
结合,说明 p
是一个指针,然后和 ()
结合,说明指针指向一个有一个整型变量作为参数的函数,最后与 int
结合,说明函数的返回类型是整型。所以 p
是一个指向有一个整型变量作为参数且返回类型是整型的函数的指针。
int *(*p(int))[3];
先看 p
与 ()
结合,说明 p
是一个有一个整型变量作为参数的函数,然后再和 *
结合,说明函数的返回类型是一个指针,然后再和 []
结合,说明指针指向一个数组,然后再和 *
结合,说明数组的元素是指针,最后再和 int
结合,说明指针指向的类型是整型。所以 p
是一个有一个整型类型参数且返回类型是一个指向由整型类型指针组成的数组的指针的函数。
总结:变量的类型由第一个相结合的符号决定(由内到外分析)
指针
指针是一个特殊的变量,里面存储的数值其实是内存中的一个地址。
全面了解指针要从四个方面来看:
- 指针的类型
- 指针指向的类型
- 指针的值或者指针指向的内存区域
- 指针本身占用的内存区
指针的类型
把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。
例子:
int *ptr; // int *
int **ptr; // int **
int (*ptr)[3]; // int (*)[3]
指针所指向的类型
把指针声明语句中的指针名字和名字左边的指针符号去掉,剩下的就是指针所指向的类型。
例子:
int *ptr; // int
int **ptr; // int *
int (*ptr)[3]; // int ()[3]
指针的算术运算中,指针所指向的类型有很大的作用。
指针的类型和指针所指向的类型完全是两个不同的概念。
指针的值或者指针所指向的内存区域地址
在 32位程序里所有类型的指针的值都是一个32位的整型,因为32位程序里的地址都是32位长。
指针所指向的内存区就是从指针的值所代表的内存地址开始,长度为 sizeof(指针所指向的类型)
的一片内存区。简单的说,就是指针其实是指向了一片内存空间,指针的值时该内存空间的首地址。
注意,指针所指向的内存区和指针所指向的类型是完全不同的概念,如果指针没有初始化,而指针所指向的类型已经确定,那么它所指向的内存区是不存在的或者是没有意义的。
指针本身所占据的内存区
指针本身占用的内存等于sizeof(指针的类型)
。
指针的算术运算
指针可以加上或者减去一个整数。
例1:
char a[20];
int *ptr=(int *)a;
ptr++;
指针 ptr
加1相当于 ptr
的值加上 sizeof(int)
。所以 ptr
指向的地址由原来的变量 a
的地址加上4个字节。由于 char
长度是一个字节,所以 ptr
指向的是 a
数组中从第四号(0开始)元素开始的四个字节。
例2:
int array[20]={0};
int *ptr=array;
for(int i=0;i<20;i++){
(*ptr)++;
ptr++;
}
这个例子中, ptr
指向的类型和数组元素的类型相同,循环中先是将 ptr
指向的元素加一然后将指针移向下一个元素,最后的效果就是依次将每个元素加一。
例3:
char a="helloworld";
char *p=a;
char **ptr=&p;
ptr++;
printf("%c",**ptr);
ptr
的类型是一个 char **
,指向的类型是 char *
,指针的值是 p
的地址,执行 ptr++
的时候,指针的值会加上一个 sizeof(char *)
也就是4,而 *(&p+4)
是一个无意义的值。
总结:
一个指针 old
加(减)一个整数 n 后,结果是一个新的指针 new
,指针的类型没有变化,指针指向的对象的类型也没有变化,new
比 old
的值增加(减少)了 n 乘 sizeof(指针指向的类型)个字节。
注意:
两个指针不能进行加法,这是非法操作,因为得到的是一个指向无意义的指针。两个指针可以进行减法,但是类型必须相同,常常用于数组。
指针类型转换
小转大不安全。
网友评论