C语言入门理解指针

作者: 博客园-原创精华区  更新时间:2020-03-06 19:43:00  原文链接


本文章为本人原创,适合于刚入坑C语言,对于指针的定义和用法模糊不清的同学,如有不正,请各位指出。

从根本来说,指针变量也是变量,只是 int 变成了 int * ,以此类推。只不过指针变量里面放的内容是普通变量在存储空间的地址(某种奇怪的 16 进制地址格式,感兴趣可自行百度)

定义指针变量的格式: int/double/...* studentp;

所以在给指针变量赋值的时候就应该: studentp=&student;

那么如何通过指针来获取 student 的值就可以直接:某变量 =*studentp; 这里一定不要和定义指针变量搞混!!!

函数指针和普通的指针其实一样,无非就是把函数名给了一个函数指针变量,在获取指针变量指向的函数的时候也是指针变量前面加一个 *

那么有人问了,我写的代码以前也没用过指针变量照样运行,那指针变量是多此一举的东西吗?

必然不是的,一个很经典的问题: swap 交换——如果要定义一个 swap 函数,交换两个变量的值,如何实现?

有人说以下代码就行,并没有用到指针呀!

 1 #include <stdio.h>
 2 
 3 void swap(int a,int b);
 4 int main(void) { 
 5     printf("小柠檬开课了!\n");
 6     
 7     int a=5,b=6;
 8     swap(a,b);
 9     printf("主函数内部a=%d,b=%d\n",a,b);
10     return 0;
11 }
12 void swap(int a,int b){
13     int tmp;
14     tmp=a;
15     a=b;
16     b=tmp;
17     printf("swap函数内部a=%d,b=%d\n",a,b);
18 }

输出:

答: C 语言编程是面向过程的编程,面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。如果我需要继续在主函数里面用到 ab 交换完成的值,那么这个函数写的就很失败,而且 C 语言返回值只能有一个,就无法使用返回的操作得到结果。

有人可能会问,为什么我 swap 里面分明让 ab 交换了,结果在 main 函数里面没有用呢?

答:这个就涉及到运行机制的原理了,每一个函数都独占一个内存空间, swap 空间的 ab main 空间的 ab 显然不是同一对 ab, 所以无论 swap 怎么折腾都不能影响 main 里面的东西。

如果用到指针变量的话,那么结果就会不一样。

现在更改成指针变量的代码:

 1 #include <stdio.h>
 2 
 3 void swap(int *a,int *b);
 4 int main(void) { 
 5     printf("小柠檬开课了!\n");
 6     
 7     int a=5,b=6;
 8     swap(&a,&b);
 9     printf("主函数内部a=%d,b=%d\n",a,b);
10     return 0;
11 }
12 
13 void swap(int *a,int *b){
14     int tmp;
15     tmp=*a;
16     *a=*b;
17     *b=tmp;
18     printf("swap函数内部a=%d,b=%d\n",*a,*b);
19 }

输出:

这里 swap 的两个形参是指针变量,用于接收 main 函数传来的 a(main) b(main) 的地址, swap 中指针变量 a(swap) b(swap) 存着 a(main) b(main) 的地址,从而通过 *a *b 的方式直接更改 main a(main) b(main) 的值。

这就是运用指针的好处。