C语言学习笔记(十)——指针基础与数组指针应用

📅 2026/8/1 5:33:27 👁️ 阅读次数 📝 编程学习
C语言学习笔记(十)——指针基础与数组指针应用

一、指针的概念

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; }

输出:

0x7ffdxxxx

2. 取值运算符*

作用:

通过地址访问对应空间中的数据。

示例:

#include <stdio.h> int main() { int num = 100; int *p; p=&num; printf("%d\n",*p); return 0; }

运行结果:

100

其中:

*p

表示访问指针指向空间中的数据。


五、指针变量案例

通过指针修改变量值:

#include <stdio.h> int main() { int num = 10; int *p; p=&num; *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 语言学习过程中一个重要的分水岭。相比之前学习的变量和数组,指针更加接近计算机底层,可以直接操作内存地址。:虽然指针初学时理解起来比较困难,但掌握指针之后,可以编写更加灵活、高效的程序。