是不是觉得 C 语言里的指针特别难?听别人说 “指针是 C 语言的灵魂”,可自己一看就头大,什么 “地址”“变量”“*”“&” 的,绕来绕去根本搞不清。其实啊,指针没那么可怕,今天兔子哥就用大白话给你讲讲,从定义到数组操作,保证新手也能看明白。咱们不说那些复杂的理论,就说怎么用、怎么理解,一起往下看吧!
指针到底是个啥呢?说白了,指针就是个变量,但它存的不是数字、不是字符,而是另一个变量的地址。打个比方,你家的门牌号就是地址,指针就像一张写着门牌号的纸条,拿着它就能找到你家。
那为啥要用指针呢?直接用变量不行吗?有时候还真不行。比如你想在函数里改外面变量的值,不用指针根本办不到;还有操作数组的时候,用指针能方便不少,代码也能更高效。
怎么定义一个指针呢?格式其实很简单,就像这样:
plaintext
int *p;这里的 “int” 表示这个指针指向的是整数类型的变量,“” 说明这是个指针变量,“p” 就是指针的名字。是不是不难?但要注意,定义的时候 “” 得跟着指针名,可别写成 “int* p;”,虽然编译器可能也认,但新手容易搞混。
定义完了,怎么让指针指向一个变量呢?这时候就得用 “&” 符号了,它的意思是 “取地址”。比如:
plaintext
int a = 10;int *p;p = &a这样一来,指针 p 就指向了变量 a,p 里存的就是 a 的地址。这时候要是想通过指针看 a 的值,就得用 “*”,“*p” 就相当于 a,你试试打印 “*p”,肯定是 10。
可能有人会问,“” 到底是啥意思啊?在定义指针的时候,“” 是告诉编译器 “这是个指针”;在使用指针的时候,“*” 就是 “通过地址找到变量”,相当于 “指向的变量”。刚开始可能有点晕,多写几遍就习惯了。
下面咱们来看看指针和数组的关系,这可是新手最容易懵的地方。数组名其实就是个指针,它代表的是数组第一个元素的地址。比如:
plaintext
int arr[5] = {1,2,3,4,5};int *p;p = arr;这里的 p 就指向了 arr [0],这时候 “*p” 就是 1,和 arr [0] 一样。那怎么用指针访问 arr [1] 呢?很简单,p++ 就行了,“*p” 就变成 2 了。是不是比写 arr [1] 方便点?
咱们用个表格对比一下,指针操作数组和下标操作数组的区别:
| 下标操作 | 指针操作 | 结果 |
|---|---|---|
| arr[0] | *p | 1 |
| arr[1] | *(p+1) | 2 |
| arr[2] | *(p+2) | 3 |
看出来了吧,其实是一回事,只是写法不一样。那为啥要用指针呢?因为指针操作起来有时候更灵活,尤其是在处理大型数组的时候,效率也高点。
可能有人会问,用指针操作数组会不会越界啊?当然会!就像下标操作一样,你要是写成 *(p+10),而数组只有 5 个元素,程序就可能出错。所以用的时候得小心,别超过数组的范围。
再举个例子,用指针遍历数组。以前你可能这么写:
plaintext
for(i=0; i<5; i++){printf("%d ", arr[i]);}用指针可以这么写:
plaintext
p = arr;for(i=0; i<5; i++){printf("%d ", *p);p++;}是不是也挺简单的?运行结果都一样。
学指针的时候,很多人会犯一个错,就是没给指针赋值就用。比如刚定义了 int p; 就去打印p,这时候 p 里的地址是不确定的,可能指向随便一个地方,程序很容易崩溃。所以记住,用指针之前一定要让它指向一个确定的变量或者分配好的内存。
兔子哥刚开始学指针的时候,也经常搞混 “*” 和 “&”,有时候还忘了给指针赋值。后来就是多写代码,把每个例子都亲手敲一遍,错了就改,慢慢就明白了。其实啊,指针这东西,看着难,多练练就会发现,也就那么回事。
别害怕用指针,刚开始慢点没关系,哪怕一行一行地写,也要保证每一步都明白。遇到不懂的地方,就停下来想想那个门牌号的比喻,或者画个图,把变量和指针的关系画出来,会清楚很多。希望你看完这个教程,能对指针有点感觉,多练几道题,肯定能掌握!
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~