ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

C语言指针入门:从零理解指针的本质

C语言指针入门:从零理解指针的本质 1. 引言指针是 C 语言中最重要也最让初学者头疼的概念之一。今天学习了 C 语言中的指针这篇文章就来系统地梳理一下指针的核心知识从基本概念到实际应用帮助你把指针彻底搞懂。指针本质上是一个变量它存储的是另一个变量的内存地址。就像门牌号指向一栋房子一样指针指向内存中的某个位置。理解指针的关键在于区分两个概念指针变量本身的值即地址和指针所指向的目标即该地址处存储的数据。打个比方指针就像快递单上的地址它本身只是一串文字但通过它我们可以找到真正的包裹。inta10;int*pa;// p 存储了变量 a 的地址运行结果p中存储的是变量a的内存地址如0x7ffc...*p的值为10。是取地址运算符用来获取变量的地址*在声明时表示“这是一个指针变量”*在使用时表示“解引用”即通过地址访问该地址处的值指针变量本身也有地址可以用p获取这在需要修改指针本身的场景中很有用指针的大小在 32 位系统上是 4 字节在 64 位系统上是 8 字节与指向的类型无关3. 指针的声明与初始化int*p;// 指向 int 类型的指针char*cp;// 指向 char 类型的指针double*dp;// 指向 double 类型的指针运行结果这段代码只是声明了三个不同类型的指针变量未初始化因此它们的值是不确定的野指针不能直接使用。指针必须初始化后才能使用否则会变成“野指针”指向未知的内存区域这是非常危险的。一个好的习惯是在声明指针时就初始化如果暂时没有合适的地址可以先将它置为NULL这样后续可以通过判断p ! NULL来避免误用。inta100;int*pa;// 正确初始化指向 aint*q;// 危险未初始化q 是野指针运行结果*p的值为100q未初始化其值不确定解引用*q会导致未定义行为可能崩溃。4. 解引用通过指针访问值#includestdio.hintmain(){inta42;int*pa;printf(a 的值: %d\n,a);// 42printf(p 指向的值: %d\n,*p);// 42*p99;// 通过指针修改 a 的值printf(修改后 a 的值: %d\n,a);// 99return0;}运行结果a 的值: 42 p 指向的值: 42 修改后 a 的值: 995. 指针与数组数组名本身就是指向数组首元素的指针常量指针这是指针最经典的应用场景。需要注意的是数组名是常量指针不能对它进行赋值操作如arr是不允许的但可以把它赋给一个普通指针变量然后通过指针进行遍历。此外arr[i]与*(arr i)在本质上是完全等价的这也是 C 语言中数组和指针关系密切的体现。intarr[5]{1,2,3,4,5};int*parr;// 等价于 int *p arr[0];// 通过指针遍历数组for(inti0;i5;i){printf(%d ,*(pi));// 等价于 arr[i]}运行结果1 2 3 4 56. 指针与函数指针作为函数参数可以实现“传引用”的效果让函数修改外部变量的值。voidswap(int*x,int*y){inttemp*x;*x*y;*ytemp;}intmain(){inta3,b5;swap(a,b);// 传入地址printf(a%d, b%d\n,a,b);// a5, b3return0;}实战用指针实现数组逆序下面这个例子综合运用了指针与函数实现数组的逆序排列。核心思路是用两个指针分别指向数组的首尾交换它们指向的值然后首指针后移、尾指针前移直到两者相遇。#includestdio.h// 通过指针实现数组逆序voidreverse(int*arr,intn){int*leftarr;// 指向首元素int*rightarrn-1;// 指向末元素while(leftright){// 交换 left 和 right 指向的值inttemp*left;*left*right;*righttemp;left;// 左指针右移right--;// 右指针左移}}intmain(){intarr[5]{1,2,3,4,5};intn5;printf(逆序前: );for(inti0;in;i){printf(%d ,arr[i]);}printf(\n);reverse(arr,n);// 传入数组名即首元素地址printf(逆序后: );for(inti0;in;i){printf(%d ,arr[i]);}printf(\n);return0;}运行结果逆序前: 1 2 3 4 5 逆序后: 5 4 3 2 1要点解析reverse函数的参数int *arr接收的是数组首元素的地址因此函数内部可以直接修改原数组。left和right两个指针分别从两端向中间移动每次交换一对元素直到left right时结束。这种写法避免了使用下标arr[i]完全通过指针运算完成能帮助你更深刻地理解指针与数组的关系。7. 指针的常见误区野指针未初始化就使用指向未知地址空指针p NULL解引用空指针会导致程序崩溃指针类型不匹配int *不能直接赋给char *越界访问指针超出数组范围可能破坏其他数据8. 总结指针是 C 语言的灵魂理解指针需要抓住三个核心指针存的是地址取地址*解引用指针可以配合数组和函数使用非常灵活多写代码、多调试指针其实没那么可怕。希望这篇文章能帮你把指针的基础打牢
返回列表