1.指针的概念
指针是一个特殊的变量,它里面存储的数值被解释为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者指针所指向的内存区,还有指针本身所占据的内存区。
①指针的类型
去掉声明中指针的名字,剩下的就是指针的类型。
例如:
int *ptr; //指针的类型是int *
char *ptr; //指针的类型是char *
int **ptr; //指针的类型是 int **
int (*ptr)[3]; //指针的类型是 int(*)[3]
int *(*ptr)[4]; //指针的类型是 int *(*)[4]
②指针所指向的类型
当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。
从语法上看,将声明中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。例如:
int *ptr; //指针所指向的类型是int
char *ptr; //指针所指向的的类型是char
int **ptr; //指针所指向的的类型是 int *
int (*ptr)[3]; //指针所指向的的类型是 int()[3]
int *(*ptr)[4]; //指针所指向的的类型是 int *()[4]
③指针的值
指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。
指针所指向的内存区就是从指针的值所代表的那个内存地址开始的,长度为sizeof(指针所指向的类型)的一片内存区。以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。
④指针本身所占据的内存区
用函数sizeof(指针的类型)测一下就知道了。在32位平台里,指针本身占据了4个字节的长度。
2.指针++的含义
ptr++含义:指针ptr的值加上sizeof(int),而非简单的数值加1。
例1:
int a[5] = {1,2,3};
int *ptr = a;
ptr++;
例2:
int array[20];
int *ptr=array;
...
//此处略去为整型数组赋值的代码。
...
for(i=0;i<20;i++)
{
(*ptr)++;
ptr++;
}
这个例子将整型数组中各个单元的值加1.由于每次循环都将指针ptr加1,所以每次循环都能访问数组的下一个单元。
例3:
int array[10]={0,1,2,3,4,5,6,7,8,9},value;
cout<<array<<endl;
//value=array[0];//也可写成:
value=*array;
cout<<value<<endl;
//value=array[3];//也可写成:
cout<<array+3<<endl;
value=*(array+3);
cout<<value<<endl;
//value=array[4];//也可写成:
cout<<array+4<<endl;
value=*(array+4);
cout<<value<<endl;
array+3等价于array数组的首地址+sizeof(int)*3。
3.指针*与&的关系
例:
int a = 12;
int b;
int *p;
int **ptr;
p = &a;
*p = 24;
ptr = &p;//取整型指针的地址
*ptr = &b;//取整型变量的地址
**ptr = 34;//赋值
注:其中的**符号。int **ptr;整型指针的指针。
实例分析
#include <iostream>
using namespace std;
void main()
{
int n;
char y[10] = "ntse";
char *x = y;
n = strlen(x);
*x = x[n];
x++;
cout<<x<<endl;
cout<<y<<endl;
}
输出结果为:
以下过程为个人理解,敬请改正:
此处最终x指向y[1]的地址,而输出y中,因为首元素为空,所以y不输出。
参考:
http://www.cnblogs.com/ggjucheng/archive/2011/12/13/2286391.html