C语言入门之指针用法教程

 更新时间:2014年09月02日 11:31:40   投稿:shichen2014  
这篇文章主要介绍了C语言入门之指针用法教程,主要对C语言中指针的本质及常见用法做了较为通俗易懂的分析,是后续深入学习C语言的基础,需要的朋友可以参考下

本文针对C语言初学者详细讲述了指针的用法,并配以实例进行说明。具体分析如下:

对于C语言初学者来说,需要明白指针是啥?重点就在一个“指”上。指啥?指的地址。啥地址?内存的地址。

上面说明就是指针的本质了。

这里再详细解释下。数据存起来是要存在内存里面的,就是在内存里圈出一块地,在这块地里放想放的东西。变量关心的是这块地里放的东西,并不关心它在内存的哪里圈的地;而指针则关心这块地在内存的哪个地方,并不关心这块地多大,里面存了什么东西。

指针怎么用呢?下面就是基本用法:

int a, b, c;
double f;

int *pt_a = &a, *pt_b = &b, *pt_c = &c;
double *pt_f = &f;

上面两行声明了三个int类型的变量a,b,c,一个double类型的变量f。下面就是指针的用法了,声明变量的时候只需要在变量前面加上“*”这个符号就说明了这个变量是指针,而前面的“int”说明指针指向的内存里面存放着int类型的变量。

变量和指针的声明也可以放到一起:

int a, b, c;
double f;

int other, *pt_a = &a, *pt_b = &b, *pt_c = &c;
double x = 0, *pt_f = &f;

然后就是新的运算符——“&”了。是不是很熟悉?没错,这个就是scanf里面的那个“&”。它是取地址符,即用在变量前面使用这个运算符,能够获得这个变量在内存里面的地址。由此就可以解释scanf双引号后面为何要使用“&”了,就是将前面按照格式读进来的数据,按照后面给出的地址直接填进内存里,所以scanf双引号后面提供的参数实质上并不是希望赋值的变量,而是希望保存数据的地址。所以,例如如果有int类型的变量a,同时有指向它的指针pt,那么下面两句是等效的:

scanf("%d", &a);
scanf("%d", pt);

回到指针,接下来就是修改指针指向变量的值了,怎么弄呢?下面就是例子:

int a;
int *pt = &a;
*pt = 123; // 该语句等同于 a = 123;

不要把“*”给忘了哈。

至于这个“*”符号,可以这么理解:需要用到指针指向的内容时,加上“*”,此时它等同于一个变量;只是需要指针的地址时,不需要加“*”,此时它代表内存的地址。

而指针也可以改变它指向的地址:

int a, b, c;
int *pt_a = &a, *pt_b = &b;
pt_b = &c;
pt_a = pt_b;

很多教材都在强调野指针的问题,什么叫野指针?呃……可以叫做“撒野”的指针。什么意思呢?举个例子,如果声明了一个指针pt,而没让他指向任何变量,那么它指向哪里呢?答案是:不确定,整个内存哪里都有可能被它指到。如果此时修改它指向的内容,而它恰好指向了系统某个关键的进程……那后果就比较严重了。所以指针用之前一定让它指点东西。如果想让它什么都不指,怎么办?很简单,指向NULL即可。

这就是指针了。可能看完很多人会觉得本来用变量你又加了个指针指不是更麻烦?我要说的是,这只是最基本的用法。C语言的数组中,还有一些复杂的数据结构都需要用到指针。所以这些基础的东西还是有必要加以熟练掌握的。

希望本文所述对大家C语言程序设计的学习有所帮助。

相关文章

  • 详解C++11中的右值引用与移动语义

    详解C++11中的右值引用与移动语义

    本篇文章主要介绍了详解C++11中的右值引用与移动语义,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • C++中静态初始化数组与动态初始化数组详解

    C++中静态初始化数组与动态初始化数组详解

    今天小编就为大家分享一篇C++中静态初始化数组与动态初始化数组详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • C/C++读写文本文件、二进制文件的方法

    C/C++读写文本文件、二进制文件的方法

    今天小编就为大家分享一篇C/C++读写文本文件、二进制文件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Linux下用C++实现俄罗斯方块

    Linux下用C++实现俄罗斯方块

    这篇文章主要为大家详细介绍了Linux下用C++实现俄罗斯方块的相关资料,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • 基于QT实现自定义温度计的示例代码

    基于QT实现自定义温度计的示例代码

    QT原生控件没有实现如仪表盘或者温度计的控件,只好自己实现,所以本文为大家介绍了如何利用qt实现自定义温度/湿度控件,感兴趣的小伙伴可以了解下
    2023-11-11
  • C语言进阶教程之字符函数和字符串函数

    C语言进阶教程之字符函数和字符串函数

    C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串中或者字符数组中,下面这篇文章主要给大家介绍了关于C语言进阶教程之字符函数和字符串函数的相关资料,需要的朋友可以参考下
    2022-11-11
  • Qt基于TCP实现客户端与服务端的连接

    Qt基于TCP实现客户端与服务端的连接

    这篇文章主要为大家详细介绍了Qt基于TCP实现客户端与服务端的连接,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • Visual Studio2000系列版本安装OpenGL的图文教程

    Visual Studio2000系列版本安装OpenGL的图文教程

    这篇文章主要介绍了Visual Studio2000系列版本安装OpenGL的图文教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • 面试常见问题之C语言与C++的区别问题

    面试常见问题之C语言与C++的区别问题

    在C中,用static修饰的变量或函数,主要用来说明这个变量或函数只能在本文件代码块中访问,而文件外部的代码无权访问,今天重点给大家介绍面试中常见的C语言与C++区别的问题,感兴趣的朋友跟随小编一起看看吧
    2021-05-05
  • C++实现LeetCode(150.计算逆波兰表达式)

    C++实现LeetCode(150.计算逆波兰表达式)

    这篇文章主要介绍了C++实现LeetCode(150.计算逆波兰表达式),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07

最新评论