intarray[10]={0,1,2,3,4,5,6,7,8,9},value; ... ... value=array[0];//也可写成: value=*array; value=array[3];//也可写成: value=*(array+3); value=array[4];//也可写成: value=*(array+4); |
char*str[3]={ "Hello,thisisasample!", "Hi,goodmorning.", "Helloworld" }; chars[80]; strcpy(s,str[0]); //也可写成strcpy(s,*str); strcpy(s,str[1]); //也可写成strcpy(s,*(str+1)); strcpy(s,str[2]); //也可写成strcpy(s,*(str+2)); |
intarray[10]; int(*ptr)[10]; ptr=&array; |
int(*ptr)[10]; |
sizeof(int(*)[10])==4 sizeof(int[10])==40 sizeof(ptr)==4 |
structMyStruct { inta; intb; intc; } MyStructss={20,30,40}; //声明了结构对象ss, 并把ss的三个成员初始化为20,30和40。 MyStruct*ptr=&ss; //声明了一个指向结构对象ss的指针。 它的类型是MyStruct*,它指向的类型是MyStruct。 int*pstr=(int*)&ss; //声明了一个指向结构对象ss的指针。 但是它的类型和它指向的类型和ptr是不同的。 |
ptr->a; ptr->b; ptr->c; |
*pstr; //访问了ss的成员a. *(pstr+1); //访问了ss的成员b. *(pstr+2) |
虽然我在我的MSVC++6.0上调式过上述代码,但是要知道,这样使用pstr来访问结构成员是不正规的,为了说明为什么不正规,让我们看看怎样通过指针来访问数组的各个单元:
例十二:
intarray[3]={35,56,37}; int*pa=array; |
*pa; //访问了第0号单元 *(pa+1); //访问了第1号单元 *(pa+2); //访问了第2号单元 |
intfun1(char*,int); int(*pfun1)(char*,int); pfun1=fun1; …… …… |
intfun(char*); inta; charstr[]="abcdefghijklmn"; a=fun(str); ... ... intfun(char*s) { intnum=0; for(inti=0;i{ num+=*s;s++; } returnnum; } |
1、floatf=12.3; 2、float*fptr=&f; 3、int*p; |
p=&f; |
p=(int*)&f; |
(TYPE*)p; |
voidfun(char*); inta=125,b; fun((char*)&a); ... ... voidfun(char*s) { charc; c=*(s+3);*(s+3) =*(s+0);*(s+0)=c; c=*(s+2);*(s+2) =*(s+1);*(s+1)=c; } } |
#p#副标题#e#
注意这是一个32位程序,故int类型占了四个字节,char类型占一个字节。函数fun的作用是把一个整数的四个字节的顺序来个颠倒。注意到了吗?在函数调用语句中,实参&a的结果是一个指针,它的类型是int*,它指向的类型是int.形参这个指针的类型是char*,它指向的类型是char.
这样,在实参和形参的结合过程中,我们必须进行一次从int*类型到char*类型的转换。结合这个例子,我们可以这样来想象编译器进行转换的过程:编译器先构造一个临时指针char*temp, 然后执行temp=(char*)&a,最后再把temp的值传递给s.所以最后的结果是:s的类型是char*,它指向的类型是char,它指向的地址就是a的首地址。
我们已经知道,指针的值就是指针指向的地址,在32位程序中,指针的值其实是一个32位整数。那可不可以把一个整数当作指针的值直接赋给指针呢?就象下面的语句:
unsignedinta; TYPE*ptr; //TYPE是int,char或结构类型等等类型。 ... ... a=20345686; ptr=20345686; //我们的目的是要使指针ptr 指向地址20345686(十进制 ) ptr=a; //我们的目的是要使 指针ptr指向地址20345686(十进制) |
unsignedinta; TYPE*ptr; //TYPE是int, char或结构类型等等类型。 ... ... a=某个数, 这个数必须代表一个合法的地址; ptr=(TYPE*)a; |
inta=123,b; int*ptr=&a; char*str; b=(int)ptr; //把指针ptr的值 当作一个整数取出来。 str=(char*)b; //把这个整数的值 当作一个地址赋给指针str。 |
chars='a'; int*ptr; ptr=(int*)&s; *ptr=1298; |
1、chara; 2、int*ptr=&a; …… 4、*ptr=115; |