是不是很多新手朋友一听到 “指针” 俩字就打怵?课本上写的 “指针是存储内存地址的变量”,看着就像天书,越看越迷糊。好不容易鼓足勇气学,写代码一用就报错,要么是段错误,要么是结果不对,最后干脆放弃,觉得自己不是学编程的料。其实啊,指针没那么难,就是咱们把它想复杂了。今天兔子哥就用大白话,结合生活例子给你讲透指针,保证小白也能看明白,一起往下看吧!
指针到底是个啥?用生活例子给你讲明白
先别想代码,咱们从生活说起。你家小区里的房子,每套房都有个门牌号吧?比如 3 号楼 2 单元 501,有了这个号,快递员就能准确找到你家。
指针就像这个门牌号。变量呢,就像你家的房子,里面存着数据(比如你的东西)。指针变量里存的不是具体数据,而是变量在内存中的 “门牌号”—— 也就是内存地址。
这么说吧:
- 普通变量:存的是数据(比如 5、“abc”)
- 指针变量:存的是普通变量的地址(就像门牌号存的是房子位置)
比如你定义 int a = 10;,这个 a 在内存里有个地址,假设是 0x1234。然后定义 int *p;,p 就是指针变量,让 p = &a,意思就是把 a 的地址(0x1234)存到 p 里。这时候 p 就像拿着 a 的门牌号,通过 p 就能找到 a。
是不是好理解多了?课本上的 “指针是地址,指针变量是存放地址的变量”,其实就是这个意思,只不过说得太绕了。
指针怎么定义和使用?一步一步来
知道了指针是啥,咱们看看怎么写代码。其实很简单,就三步:定义指针、给指针赋值、用指针操作变量。
第一步:定义指针。
格式是 “数据类型 * 指针名;”,比如:
int *p; // 定义一个指向 int 类型变量的指针 p
float *q; // 定义一个指向 float 类型的指针 q
这里的 * 不是乘法,是告诉编译器 “这是个指针变量”。注意哦,指针的类型要和它指向的变量类型一致,int 指针指向 int 变量,别乱指,不然容易出错。
第二步:给指针赋值。
指针得指向一个变量的地址才行,不能让它空着瞎指(后面说为啥)。用 & 符号取变量的地址,然后赋给指针:
int a = 10;
int *p;
p = &a // 把 a 的地址给 p,p 现在指向 a
第三步:通过指针操作变量。
想通过指针找到变量并修改它的值,得用符号(这时候叫解引用):
*p = 20; // 意思是 “找到 p 指向的变量,把它改成 20”
这时候 a 的值也会变成 20,因为 p 指向的就是 a。咱们写个完整例子:
plaintext
#include int main(){int a = 10;int *p; // 定义指针p = &a // 指针指向aprintf("a原来的值:%d\n", a);*p = 20; // 通过指针改a的值printf("a现在的值:%d\n", a);return 0;} 运行结果会是 a 原来 10,现在 20。是不是很神奇?通过指针这个 “门牌号”,就能找到房子并修改里面的东西。
不用指针行不行?指针有啥好处
可能有人会问,我直接用变量名操作不就行了,为啥非要用指针?平时写简单代码,确实可以不用,但遇到这几种情况,指针就很有用了。
- 函数里想修改外面变量的值。
比如写个交换两个变量值的函数,不用指针根本做不到:
plaintext
// 错误写法,交换不了void swap(int x, int y){int temp = x;x = y;y = temp;}// 正确写法,用指针void swap(int *x, int *y){int temp = *x;*x = *y;*y = temp;}调用的时候用 swap (&a, &b);,就能真正交换 a 和 b 的值。因为函数参数默认是传值,不用指针的话,改的是 x 和 y 的副本,外面的 a 和 b 没变。
- 处理数组更方便。
数组名本身就是数组第一个元素的地址,用指针操作数组,比用下标有时候更灵活。比如遍历数组:
plaintext
int arr[5] = {1,2,3,4,5};int *p = arr; // 数组名就是地址,不用加&for (int i=0; i<5; i++){printf("%d ", *(p+i)); // 等价于arr[i]}- 节省内存,尤其是处理大数据的时候。
如果变量很大(比如结构体),传参的时候传指针比传整个变量快多了,因为指针就占几个字节,而变量可能占几百上千字节。
新手用指针最容易踩的坑,提前避开
- 指针没赋值就用,也就是 “野指针”。
定义了 int p;,没给 p 赋值就用p = 10;,这时候 p 不知道指向哪,可能改到系统重要内存,程序直接崩溃。解决办法:要么让它指向一个变量,要么暂时赋值为 NULL(空指针)。 - 指针类型和指向的变量类型不匹配。
比如 int p; float a=3.14; p=&a 这样写虽然可能编译通过,但用p 操作时,会按 int 类型解读 float 的内存,结果肯定错。 - 解引用的时候忘了加 *。
想通过 p 改 a 的值,写成 p=20; 这其实是把 p 指向了地址 20,而不是改 a 的值,大错特错,一定要加 *。
我当初学指针时,就因为野指针让程序崩了无数次,后来养成习惯,定义指针后要么马上赋值,要么设为 NULL,就很少出错了。
其实指针这东西,就像学骑自行车,刚开始觉得难,摔几次跤,掌握了平衡就好了。关键是别害怕,多写几个简单例子,比如用指针改变量、用指针操作数组,慢慢就有感觉了。兔子哥建议大家从最简单的代码开始,每次只做一件事,比如先练定义和赋值,再练解引用,一步一步来。
指针是 C 语言的精华,学会了它,你会发现代码能写得更灵活、更高效。别被那些晦涩的概念吓住,记住 “指针就是门牌号”,你肯定能学会。有啥不懂的地方,随时来问兔子哥,看到都会回的。
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~