1.指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。 要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的 类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。
2.指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在32位程序里,所有类型的指针
值都是一个32位整数,因为32位程序里内存地址全都是32位长。指针所指向的内存区就是从指针的值所代表的那个内存地址开始,
度为si zeof(指针所指向的类型)的一片内存区。以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内
存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。
1、chara[20];
2、int*ptr=a;
…
…
3、ptr+=5;
在这个例子中,ptr被加上了5,编译器是这样处理的:将指针ptr的值加上5乘sizeof(int),在32位程序中就是加上了5乘
4=20。由于地址的单位是字节,故现在的ptr所指向的地址比起加5后的ptr所指向的地址来说,向高地址方向移动了20个字节。在这
个例子中,没加5前的ptr指向数组a的第0号单元开始的四个字节,加5后,ptr已经指向了数组a的合法范围之外了。虽然这种情况在
应用上会出问题,但在语法上却是可以的。这也体现出了指针的灵活性。
charstr[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));
上例中,str是一个三单元的数组,该数组的每个单元都是一个指针,这些指针各指向一个字符串。把指针数组名str当作一个指针的话,它指向数组的第0号单元,它的类型是char**,它指向的类型是char*。
str 也是一个指针,它的类型是char,它所指向的类型是char,它指向的地址是字符串"Hello,thisisasample!"的第一个字符的地址,即’‘H’‘的地址。 str+1也是一个指针,它指向数组的第1号单元,它的类型是char**,它指向的类型是char*。
(str+1)也是一个指针,它的类型是char,它所指向的类型是char,它指向 "Hi,goodmorning."的第一个字符’‘H’’,等等。
intarray[10];
int(*ptr)[10];
ptr=&array;
上例中ptr是一个指针,它的类型是int(*)[10],他指向的类型是int[10] ,我们用整个数组的首地址来初始化它。在语句
ptr=&array中,array代表数组本身。
intarray[3]={35,56,37};
int*pa=array;
通过指针pa访问数组array的三个单元的方法是:
*pa;//访问了第0号单元
*(pa+1);//访问了第1号单元
*(pa+2);//访问了第2号单元
chars=’‘a’’;
intptr;
ptr=(int)&s;
ptr=1298;
指针ptr是一个int类型的指针,它指向的类型是int。它指向的地址就是s的首地址。在32位程序中,s占一个字节,int类型占四个字节。