指针详解(从基础到入门)
一、什么是指针
在计算机科学中,指针是编程语言中的一个对象,利用地址,它直接指向存在电脑储存器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,指针指向该变量单元。因此,将地址形象化地称为指针。意思是通过它能找到以它为地址的内存单元。从另外一个方面来讲,指针就是一个变量,用来存放内存单元的地址(编码),地址唯一标识一块内存空间。
可通过下面C代码来加以说明:
#include int main() { int a=10;//在内存中开辟一块空间 int *p=&a;//取出a的地址,将a的地址存放在p变量中,p就是一个指针变量 return 0; }
ps:存放在指针中的值都被当做地址来处理,在32位平台上一个指针变量占4个字节,在64位平台上一个指针变量占8给字节
二、指针类型的意义
既然指针变量的大小是固定的,那么为什么还有各种指针类型呢?
1、指针类型决定了指针解进行引用操作时,能够访问空间的大小
下面举例说明:
当指针类型为字符型时,有以下C代码
通过观察a的地址变化可知,对char类型的指针进行解引用操作并改变其对应的值时,可以改变两个字节内容(只能访问两个字节的空间)。
当指针类型为整形时,有以下C代码
通过观察a的地址在内存中的变化可知,对int类型的指针进行解引用操作并改变其对应的值时,可以改变四个字节内容(可以访问四个字节的空间)。
总结:指针的类型决定了对指针进行解引用操作时有多大权限。比如,char *的指针解引用就只能访问一个字节,而int *的指针解引用能访问四个字节,double *的指针解引用就能访问八个字节。
2、指针的类型决定了指针加减整数的步长
观察以下C代码及其运行结果:
我们不难发现,整形指针变量(pa)+1后,地址由C4跳跃到C8,向后跳跃了4个字节(一个整形);字符型指针变量(pc)+1后,地址由C4跳跃到C5,向后跳跃了1个字节(一个字符);类似的,double类型的指针变量+1后,地址应向后跳跃8个字节。
总结:指针类型决定了指针向前或向后走一步有多大(距离)。
可通过以下例题加深我们对其的理解
例题:已知数组int arr[10]={0},利用指针将数组元素全置为1
#include int main() { int arr[10]={0}; int* p=arr;//数组名表示首元素地址 int i=0; for(i=0;i *(p+i)=1;//p为int类型的指针,每加一向后跳跃一个整形(4个字节) } for(i=0;i printf("%d ",arr[i]); } return 0; } int arr[10]={0}; char* p=arr;//数组名表示首元素地址 int i=0; for(i=0;i *(p+4*i)=1;//p为char类型的指针,每加一向后跳跃一个字符(1个字节),题设数组元素为整形(4个字节),应该加上4*i } for(i=0;i printf("%d ",arr[i]); } return 0; } int* p;//局部指针变量未初始化,默认为随机值 *p=10; return 0; } int arr[10]={ 0 }; int* p=arr;//数组名代表首元素地址 int i=0; for(i=0;i *(p++)=i; //数组元素个数为10,当i9时,指针指向的范围超过了数组arr的范围,此时p就是野指针 } return 0; } int a = 10; //a为局部变量,函数开始时创建,函数结束时销毁 return &a; } int main() { int* p = test(); *p = 20; //此时p指向的空间已销毁(被释放),不属于当前程序,此时指针p就为野指针 return 0; } int i = 0; int j = 0; for (i = 0; i
还没有评论,来说两句吧...