一、指针的概念
1. 什么是地址
计算机中的变量都存储在内存空间中。
为了区分不同的内存空间,计算机会给每一个存储单元分配一个编号,这个编号就是:地址
int num = 10;变量num在内存中有自己的存储空间,同时也具有对应的地址。
可以通过:
&num获取变量num的地址。
二、什么是指针
指针可以理解为:
存储地址的变量。
普通变量保存的是数据:
int num = 10;而指针变量保存的是地址:
int *p;例如:
int num = 10; int *p; p = #此时:
num 10 p num的地址指针变量p指向变量num。
三、指针变量定义
指针变量定义格式:
数据类型 *变量名;例如:
int *p; char *str; double *q;不同类型的指针表示:
int *:指向整型数据char *:指向字符型数据double *:指向双精度数据
四、指针相关运算符
C语言中指针主要涉及两个运算符:
1. 取地址运算符&
作用:
获取变量在内存中的地址。
示例:
#include <stdio.h> int main() { int num = 100; printf("%p\n",&num); return 0; }输出:
0x7ffdxxxx2. 取值运算符*
作用:
通过地址访问对应空间中的数据。
示例:
#include <stdio.h> int main() { int num = 100; int *p; p=# printf("%d\n",*p); return 0; }运行结果:
100其中:
*p表示访问指针指向空间中的数据。
五、指针变量案例
通过指针修改变量值:
#include <stdio.h> int main() { int num = 10; int *p; p=# *p=100; printf("num=%d\n",num); return 0; }运行结果:
num=100说明:
通过指针可以直接修改变量所在内存空间的数据。
六、野指针与空指针
1. 野指针
野指针:
未初始化或者指向已经释放空间的指针。
例如:
int *p;此时p没有明确指向。
错误使用:
*p=10;可能导致程序异常。
因此:
不要使用未经初始化的指针。
2. 空指针
空指针:
指向地址0x0的指针。
定义:
int *p=NULL;例如:
int *p=NULL; *p=10;由于空地址不可访问,会导致程序崩溃。
七、指针运算
指针支持部分算术运算。
例如:
p++;表示:
指针向高地址方向移动一个数据类型大小。
如果:
int *p;执行:
p++;地址会增加:
sizeof(int)个字节。
八、指针作为函数参数
之前学习函数参数传递时,值传递无法修改外部变量:
void change(int a) { a=100; }调用后:
外部变量不会改变。
如果希望修改外部变量,需要使用地址传递。
示例:
#include <stdio.h> void change(int *p) { *p=100; } int main() { int num=10; change(&num); printf("%d\n",num); return 0; }运行结果:
100原因:
函数接收的是变量地址,通过指针修改原变量。
九、一维数组与指针关系
C语言中:
数组名可以理解为指向数组第一个元素的指针。
例如:
int a[5]={1,2,3,4,5};定义指针:
int *p; p=a;等价于:
p=&a[0];十、数组元素访问与指针
数组访问:
a[2]等价于:
*(a+2)也等价于:
*(p+2)还可以写:
p[2]例如:
#include <stdio.h> int main() { int a[5]={10,20,30,40,50}; int *p=a; printf("%d\n",*(p+2)); return 0; }输出:
30十一、一维数组传参
数组作为函数参数时:
可以传递:
int fun(int array[],int len);也可以写:
int fun(int *array,int len);两种形式效果相同。
十二、利用指针封装冒泡排序
利用数组指针,可以封装排序函数:
#include <stdio.h> void BubbleSort(int *p,int len) { int i,j,tmp; for(i=0;i<len-1;i++) { for(j=0;j<len-1-i;j++) { if(p[j]>p[j+1]) { tmp=p[j]; p[j]=p[j+1]; p[j+1]=tmp; } } } } int main() { int a[5]={5,3,8,1,2}; BubbleSort(a,5); for(int i=0;i<5;i++) { printf("%d ",a[i]); } return 0; }运行结果:
1 2 3 5 8结语
指针是 C 语言学习过程中一个重要的分水岭。相比之前学习的变量和数组,指针更加接近计算机底层,可以直接操作内存地址。:虽然指针初学时理解起来比较困难,但掌握指针之后,可以编写更加灵活、高效的程序。