欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C语言入门理解指针

程序员文章站 2022-03-07 15:27:00
本文章为本人原创,适合于刚入坑C语言,对于指针的定义和用法模糊不清的同学,如有不正,请各位指出。 从根本来说,指针变量也是变量,只是int变成了int *,以此类推。只不过指针变量里面放的内容是普通变量在存储空间的地址(某种奇怪的16进制地址格式,感兴趣可自行百度) 定义指针变量的格式:int/do ......

本文章为本人原创,适合于刚入坑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语言入门理解指针

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

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

答:这个就涉及到运行机制的原理了,每一个函数都独占一个内存空间,swap空间的abmain空间的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 }

输出:

 C语言入门理解指针

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

这就是运用指针的好处。