一、什么是指针

C语言里,变量存放在内存中,而内存其实就是一组有序字节组成的数组,每个字节有唯一的内存地址。CPU 通过内存寻址对存储在内存中的某个指定数据对象的地址进行定位。这里,数据对象是指存储在内存中的一个指定数据类型的数值或字符串,它们都有一个自己的地址,而指针便是保存这个地址的变量。也就是说:指针是一种保存变量地址的变量。

前面已经提到内存其实就是一组有序字节组成的数组,数组中,每个字节大大小固定,都是 8bit。对这些连续的字节从 0 开始进行编号,每个字节都有唯一的一个编号,这个编号就是内存地址。示意如下图:

这是一个 4GB 的内存,可以存放 2^32 个字节的数据。左侧的连续的十六进制编号就是内存地址,每个内存地址对应一个字节的内存空间。而指针变量保存的就是这个编号,也即内存地址。

二、为什么要使用指针?

在C语言中,指针的使用非常广泛,因为使用指针往往可以生成更高效、更紧凑的代码。总的来说,使用指针有如下好处:

1)指针的使用使得不同区域的代码可以轻易的共享内存数据,这样可以使程序更为快速高效;

2)C语言中一些复杂的数据结构往往需要使用指针来构建,如链表、二叉树等;

3)C语言是传值调用,而有些操作传值调用是无法完成的,如通过被调函数修改调用函数的对象,但是这种操作可以由指针来完成,而且并不违背传值调用。

三、如何声明一个指针

3.1 声明并初始化一个指针

指针其实就是一个变量,指针的声明方式与一般的变量声明方式没太大区别:int *p; // 声明一个 int 类型的指针 p

char *p // 声明一个 char 类型的指针 p

int *arr[10] // 声明一个指针数组,该数组有10个元素,其中每个元素都是一个指向 int 类型对象的指针

int (*arr)[10] // 声明一个数组指针,该指针指向一个 int 类型的一维数组

int **p; // 声明一个指针 p ,该指针指向一个 int 类型的指针

指针的声明比普通变量的声明多了一个一元运算符 “*”。运算符 “*” 是间接寻址或者间接引用运算符。当它作用于指针时,将访问指针所指向的对象。在上述的声明中: p 是一个指针,保存着一个地址,该地址指向内存中的一个变量; *p 则会访问这个地址所指向的变量。

声明一个指针变量并不会自动分配任何内存。在对指针进行间接访问之前,指针必须进行初始化:或是使他指向现有的内存,或者给他动态分配内存,否则我们并不知道指针指向哪儿,这将是一个很严重的问题,稍后会讨论这个问题。初始化操作如下:/* 方法1:使指针指向现有的内存 */

int x = 1;

int *p = &x;  // 指针 p 被初始化,指向变量 x ,其中取地址符 & 用于产生操作数内存地址

/* 方法2:动态分配内存给指针 */

int *p;

p = (int *)malloc(sizeof(int) * 10);    // malloc 函数用于动态分配内存

free(p);    // free 函数用于释放一块已经分配的内存,常与 malloc 函数一起使用,要使用这两个函数需要头文件 stdlib.h

指针的初始化实际上就是给指针一个合法的地址,让程序能够清楚地知道指针指向哪儿。

3.2 未初始化和非法的指针

如果一个指针没有被初始化,那么程序就不知道它指向哪里。它可能指向一个非法地址,这时,程序会报错,在 Linux 上,错误类型是 Segmentation fault(core dumped),提醒我们段违例或内存错误。它也可能指向一个合法地址,实际上,这种情况更严重,你的程序或许能正常运行,但是这个没有被初始化的指针所指向的那个位置的值将会被修改,而你并无意去修改它。用一个例子简单的演示一下:#include "stdio.h"

int main(){

int *p;

*p = 1;

printf("%d\n",*p);

return 0;

}

这个程序可以编译通过,但是运行的话会报错,报错信息如下:

要想使这个程序运行起来,需要先对指针 p 进行初始化:#include "stdio.h"

int main(){

int x = 1;

int *p = &x;

printf("%d\n",*p);

*p = 2;

printf("%d\n",*p);

return 0;

}

这段代码的输出结果如下:

可以看到,对指针进行初始化后,便可以正常对指针进行赋值了。

3.3 NULL指针

NULL 指针是一个特殊的指针变量,表示不指向任何东西。可以通过给一个指针赋一个零值来生成一个 NULL 指针。#include "stdio.h"

int main(){

int *p = NULL;

printf("p的地址为%d\n",p);

return 0;

}

/***************

* 程序输出:

* p的地址为0

***************/

可以看到指针指向内存地址0。在大多数的操作系统上,程序不允许访问地址为 0 的内存,因为该内存是为操作系统保留的。但是,内存地址 0 有一个特别重要的意义,它表明改指针不指向一个可访问的内存位置。

更多web开发知识,请查阅 HTML中文网 !!

指针c语言有什么作用,c语言中指针有什么用?相关推荐

  1. c语言record的作用,C语言基础 record 2-指针,结构体,链表,文件的输入输出

    指针: 1.指针的概念: 内存区的每一个字节有一个编号,这就是 '地址',由于通过地址能找到所需的变量单元,而地址指向该变量单元,所以将地址形象化称为 '指针'.C/C++中是可多继承的指针,而Jav ...

  2. C语言文件缓冲区作用,C语言 文件操作4--文件结构体FILE的理解以及缓冲区再讲...

    //文件结构体FILE的理解以及缓冲区再讲 #include #include //要点:文件结构 //struct _iobuf { // char *_ptr; ------当前缓冲区内容指针 / ...

  3. c语言fun的作用,c语言fun函数有什么作用

    c语言fun函数有什么作用 c语言fun函数的作用是被主函数所调用,来定义一个函数或方法,这样在引用时可以用fun表示,比如[int fun(int x,int y)]. c语言fun函数的作用是: ...

  4. c语言 运算符的作用,C语言运算符

    原标题:C语言运算符 运算符 在应用程序中,经常会对数据进行运算,为此,C语言提供了多种类型的运算符,即专门用于告诉程序执行特定运算或逻辑操作的符号.根据运算符的作用,可以将 C语言中常见的运算符分为 ...

  5. c语言 const常量作用,C语言 const常量讲解

    //const的本质 //const本质上是伪常量,无法用于数组初始化以及全局变量初始化 //原因在于const仅仅限定变量无法直接赋值,但是却可以通过指针间接赋值 //例如局部常量在栈区,而不在静态 ...

  6. c语言地址符作用,C语言中指针和取地址符的关系

    一 概念定义: 严格说起来,应该这么讲:指针存的是地址,而&运算符是取变量的地址. 指针原理: 其实计算机中的内存就像一个个抽屉(一兆内存就相当于1百万个抽屉),每个抽屉都有一个编号,用于存放 ...

  7. c语言算术运算的作用,C语言算术运算符和算术表达式

    C语言算术运算符和算术表达式 运算符用于执行程序代码运算,会针对一个以上操作数项目来进行运算.下面和大家分享一些C语言算术运算符和算术表达式,一起来看看吧! 一. 基本的算术运算符 (1)+(加法运算 ...

  8. c语言get()的作用,c语言get函数的用法有哪些

    C语言中gets从标准输入设备读字符串函数,可以无限读取,不会判断上限,今天学习啦小编在这里为大家介绍C语言get函数的用法,欢迎大家阅读! c语言get函数的用法:int getc(FILE *st ...

  9. c语言memset函数作用,C语言memset函数使用方法详解

    C语言memset函数使用方法详解 一.函数原形   void *  memset(void*s,int ch,size_t n) 二.函数作用  将以s内存地址为首的连续n个字节的内容置成ch,一般 ...

  10. c语言选择结构作用,c语言选择结构程序设计教案

    <c语言选择结构程序设计教案>由会员分享,可在线阅读,更多相关<c语言选择结构程序设计教案(16页珍藏版)>请在人人文库网上搜索. 1.选择结构程序设计(一)说明内容1关系运算 ...

最新文章

  1. Windows Python3.6 安装 IPython(Jupyter) qtconsole
  2. 【性能优化】面试官:Java中的对象和数组都是在堆上分配的吗?
  3. MySQL中如何删除数据
  4. how is configuration data loaded for framework preloadLibCss
  5. python绘图函数m_Python散点图。m的尺寸和样式
  6. matlab实现unix时间戳到标准时间的转换
  7. WEG的完整形式是什么?
  8. 鸟哥基础-读书笔记一
  9. SpringCloud Consul Config 配置中心 (二)
  10. 在Eclipse中用Maven打包jar包--完整版
  11. 使用正当时!用扩展全面武装Firefox
  12. 【Day34】Pyhotn之路——网络编程
  13. SameMovie HBOMax Video Downloader for Mac如何在 Mac 上下载 HBO Max 视频?
  14. 怎样绘制流程图?分享拼多多购物流程图模板及绘制技巧
  15. n1装linux系统升级,N1 降级刷机救砖总结
  16. 在线渐变配色网站分享
  17. 关于H.265/HEVC视频压缩标准相较H.264/AVC节省50%左右的带宽方案的推荐
  18. jQuery的隐藏显示hide(),show()方法
  19. django html菜单,使用Django模板的导航菜单
  20. excel筛选时保留下面某些行不被筛选

热门文章

  1. Python——理论学习笔记
  2. android 磁贴布局,拼图酱 - 通过布局、磁贴、滤镜等元素重新组合照片,充满乐趣 - Android 应用 - 图像 - 【最美应用】...
  3. 求逆矩阵的c语言程序,求逆矩阵——C语言
  4. python函数题、咖啡名称_使用Python来分析秋天的第一杯咖啡
  5. java提现功能开发_如何利用java实现提现金额到支付宝账户的功能
  6. 勾股定理算斜边用计算机怎么按,三角形斜边(直角三角形斜边计算器)
  7. StartUp.xls宏病毒清除方法(excel宏病毒)
  8. Vicdas实时历史库数据库 v2.3.0.201206
  9. 用命令设置 ip 地址
  10. Pandas库之DataFrame