C++指针 详细介绍及总结

2020-01-06 15:50:20丽君

在不同的表达式中数组名array可以扮演不同的角色。 

在表达式sizeof(array)中,数组名array代表数组本身,故这时sizeof函数测出的是整个数组的大小。 

在表达式*array中,array扮演的是指针,因此这个表达式的结果就是数组第0号单元的值。sizeof(*array)测出的是数组单元的大小。 

表达式array+n(其中n=0,1,2,....。)中,array扮演的是指针,故array+n的结果是一个指针,它的类型是TYPE*,它指向的类型是TYPE,它指向数组第n号单元。故sizeof(array+n)测出的是指针类型的大小。

例十: 


int array[10]; 
int (*ptr)[10]; 
ptr=&array; 

上例中ptr是一个指针,它的类型是int (*)[10],他指向的类型是int [10],我们用整个数组的首地址来初始化它。在语句ptr=&array中,array代表数组本身。

本节中提到了函数sizeof(),那么我来问一问,sizeof(指针名称)测出的究竟是指针自身类型的大小呢还是指针所指向的类型的大小?答案是前者。例如:

int (*ptr)[10]; 

则在32位程序中,有: 


sizeof(int(*)[10])==4 
sizeof(int [10])==40 
sizeof(ptr)==4 

实际上,sizeof(对象)测出的都是对象自身的类型的大小,而不是别的什么类型的大小。  

指针和结构类型的关系

可以声明一个指向结构类型对象的指针。 

例十一: 


struct MyStruct 
{ 
int a; 
int b; 
int c; 
} 

MyStruct ss={20,30,40};//声明了结构对象ss,并把ss的三个成员初始化为20,30和40。
MyStruct *ptr=&ss;//声明了一个指向结构对象ss的指针。它的类型是
MyStruct*,它指向的类型是MyStruct。
int *pstr=(int*)&ss;//声明了一个指向结构对象ss的指针。但是它的类型和它指向的类型和ptr是不同的。

请问怎样通过指针ptr来访问ss的三个成员变量? 

答案: 


ptr->a; 
ptr->b; 
ptr->c; 

又请问怎样通过指针pstr来访问ss的三个成员变量? 

答案:  


*pstr;//访问了ss的成员a。 
*(pstr+1);//访问了ss的成员b。 
*(pstr+2)//访问了ss的成员c。 

呵呵,虽然我在我的MSVC++6.0上调式过上述代码,但是要知道,这样使用pstr来访问结构成员是不正规的,为了说明为什么不正规,让我们看看怎样通过指针来访问数组的各个单元:

例十二: 


int array[3]={35,56,37}; 
int *pa=array; 

通过指针pa访问数组array的三个单元的方法是: 


*pa;//访问了第0号单元 
*(pa+1);//访问了第1号单元 
*(pa+2);//访问了第2号单元