目录
什么是指针
指针的定义
指针的应用
指针与数组
什么是指针
计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样。为了正确地访问这些数据,必须为每个字节都编上号码,就像门牌号一样,每个字节的编号是唯一的,根据编号可以准确地找到某个字节。我们将内存中字节的编号称为地址(Address)或指针(Pointer)。地址从0开始依次增加,对于32位环境,程序能够使用的内存为4GB。
最小的地址为0x00000000,最大的地址为0XFFFFFFF。
指针的定义
定义指针变量与定义普通变量非常类似,不过要在变量名前面加星号格式为:datatype*name;或者
datatype∗name=&Value;
*表示这是一个指针变量, datatype表示该指针变量所指向的数据的类型。在指针定义中*号是和变量名结合;
int*p;//未初始化
int a=20;
p=&a;//跟下面相同
int*p=&a;//p代表的是地址,而*p是对地址的解引用代表的是数值
指针的应用
1)值传递
void swap(int x,int y)
{
int a;
a=x;
x=y;
y=a;}
int main()
{int x=10,y=20;
swap(x,y);//x,y的值传递到空函数中去
printf("%d,%d",x,y);
return 0;}
2)指针传递,指针和函数
void swap(int *x,int *y)
{
int a;
a=*x;
*x=*y;
*y=a;}
int main()
{int x=10,y=20;
swap(&x,&y);//x,y的值传递到空函数中去
printf("%d,%d",x,y);
return 0;}
指针与数组
数组名被看作该数组的第一个元素在内存中的首地址(仅在sizeof操作中例外,该操作给出数组所占内存大小)。数组名在表达式中被自动转换为一个指向数组第一个元素的指针常量。
数组名是指针,非常方便,但是却丢失了数组另一个要素:数组的大小,即数组元素的数量。编译器按数组定义时的大小分配内存,但运行时对数组的边界不加检测。
注意:1.指针变量与整型量的加减表示移动指针,以指向当前目标前面或后面的若干个位置的地址。指针与整型量i的加减等于指针值(地址)与i*sizeof(目标类型)积的加减,得出新的地址。
2.运算结果并不表明那儿有一个指针所规定的数据类型的变量,即使是对数组操作。这称作不对数组边界做检查。指针的算术运算很容易超出数组的边界,需要小心越界问题。
3. 两个同类型指针,指向连续空间可以相减。减后的结果是数据元素的大小。
char类型指针- char类型指针的结果是char数据元素的个数。
4. 当且仅当两个同类型指针变量指向同一数组中的元素时,可以用关系运算符>,==,!=等进行比较,比较规则是指向后面元素的指针大,指向同一元素的相等。
总结
1)指针变量可以进行加减运算,例如p++、p-i、p-=i。指针变量的加减运算并不是简单的加上或减去一个整数,而是跟指针指向的数据类型有关。
2)给指针变量赋值时,要将一份数据的地址赋给它,不能直接赋给一个整数,例如int*ip=(int*)0x1234;是没有意义的,使用过程中一般会导致程序崩溃。注意0x1234,是十六进制整型常量,必须强制转换成指针类型。
3)使用指针变量之前一定要初始化,否则就不能确定指针指向哪里(野指针),如果它指向的内存没有使用权限,程序就崩溃了。对于暂时没有指向的指针,建议赋值NULL。
4)两个指针变量可以相减。如果两个指针变量指向同一个数组中的某个元素,那么相减的结果就是两个指针之间相差的元素个数。
5)数组也是有类型的,数组名的本意是表示一组类型相同的数据。在定义数组时,或者和sizeof、&运算符一起使用时数组名才表示整个数组,否则表达式中的数组名会被转换为一个指向数组首元素的指针。
6)指针类型不同,不能互相赋值。
如:
lnt∗p=NULL;
char∗cp=NULL;
ip=cp;或cp=ip;都是错误的赋值。
必须强制类型转换:ip =(int*)cp;或 cp=(char*)ip;才可以赋值。