指针是C语言的灵魂,精华之所在。指针强大而危险,用得好是一大利器,用得不好是一大
潜在危害。正是指针具有强大而又危险的特性,加上指针比较难,很多人用的不好,所以越是封装
程度高的语言,越是没有指针的"存在"。比如JAVA,Python,就是把指针隐藏去了,不让用户接触,但很多功能
实质上还是用到指针的,只不过是封装好了,对用户隐藏。

如果指针学得好,在编程时可谓如虎添翼,用起招式也会游刃有余。

很多人觉得指针很难,其实不然,只要理解了指针的实质,多见,多练,也就是1+1=2的事。

指针的实质也很简单:在C语言中,指针是一种数据类型,用来存放各种类型的地址,通过地址可以找到该地址
单元的值,故称指针。简单而言,指针就是存放地址的。

指针强大的原因:程序要运行就必须加载到内存中去,因此程序的要运行的指令和所要
用到的数据都可以通过内存地址也就是指针获取到,有了指针你就可以掌控程序运行的流程和所用到的数据
然后可以为所欲为了,当然指针所能访问的一般而言都是合法的地址,至于如何访问不合法的地址,那就是另外的话题。

现在来看看指针的一些用法。
在C语言中,任何类型的指针的大小是4个字节,因为存放的都是地址。
1.
  int *p;//定义了一个整型指针,可以存放整型数据的地址
  int a=3;
  p=&a;(p就了存放a的地址,也就是说p指向了a,*p就等于3)

2.

  char*p="abcdef";//字符指针,p存放的是第一个字符(a)的地址,*p==a;

3.
  int a1[10];//整型数组,a1是一个数组,存放整型(int)数据
  int *p1=a1;//数组指针,p1是一个指针,存放整型数据的地址

  int *a2[10];//指针数组,a2是一个数组,存放的是整型指针(int*)数据

  int (*p2)[10];//数组指针,p2是一个指针,存放的是存放10个整型数据的数组的地址

4.
  void fun(int,int)
  {

  }

  void(*p1)(int,int);//函数指针,p1是一个指针,存放的是一个返回值为void,参数为两个int的函数的地址
  p1=fun;//函数名即为函数的地址.
  p1();

  常见用法:typedef void(*pointer)(int,int);//pointer为自定义的类型,这种类型表示可以定义返回值为void,参数为两个int型的函数的指针

  pointer p2;//p2是一个函数指针
  p2=fun;
  p2();

5.
  void(*a[10])(int);//指针函数,a是一个数组,因为'[' 的优先级比'*'大,a先和‘[’结合,存放的数据是返回值为void,参数为一个int的函数指针,

6.
  void(*(*p)[10])();//数组指针,p是一个指针,指向(存放10个返回值为void,没有参数的函数指针数据的)数组的地址

7.
  二级指针:表示指针存放的数据本身又是一个指针。

  char **p;//二级指针

  char*str[2]={"abc","defg"];//字符串数组

  p=str;//p是一个二级指针存放数组的地址,*p也是一个指针,存放的是第一个字符串的首字符的地址,**p就是字符'h'

8.

  指针可以进行加减运算

  int a[10];
  假设
  a[0]的地址:  1000(十进制)
  a[1]的地址:  1004//因为int在C语言中占4个字节
  a[2]的地址:  1008

  int*p=a;  //p存放的就是a[0]的地址1000,因为数组名就是数组第一个元素的地址

  p++;  //此时p不是加1变成1001,此时p应该为1004,指针的加减是按数据类型所占的字节数进行加减的
           //因为int占4个字节,所以p++为1004指向下一个元素。也就是a[1]

9.

  指针还有很多用法,有些起来很复杂,但是本质都一样,至于如何把指针的强大之处用起来,就要靠各位
  在写程序时按需发挥了。

  还是那句话,想熟悉一样东西,要多见,多练,多想。

C语言指针的一些用法的更多相关文章

  1. C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com

    原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...

  2. C语言指针和数组知识总结(上)

    C语言指针和数组知识总结(上) 一.指针的基础 1.C语言中,变量的值能够通过指针来改变,打印指针的语句符号可以是:  %08x 2.指针的本质 指针的本质就是变量,那么既然是变量,那么一定会分配地址 ...

  3. 2-Linux C语言指针与内存-学习笔记

    Linux C语言指针与内存 前面我们对于: c语言的基本用法 makeFile文件的使用 main函数的详解 标准输入输出流以及错误流管道 工具与原理 指针与内存都是c语言中的要点与难点 指针 数组 ...

  4. C语言指针与数组

    C语言指针与数组 数组的下标应该从0还是1开始? 我提议的妥协方案是0.5,可惜他们未予认真考虑便一口回绝    -- Stan Kelly-Bootle   1. 数组并非指针 为什么很多人会认为指 ...

  5. C 语言指针 5 分钟教程

    指针.引用和取值 什么是指针?什么是内存地址?什么叫做指针的取值?指针是一个存储计算机内存地址的变量.在这份教程里“引用”表示计算机内存地址.从指针指向的内存读取数据称作指针的取值.指针可以指向某些具 ...

  6. 关于C语言指针的一些新认识(1)

    Technorati 标签: 指针,数组,汇编,C语言 前言 指针是C语言的精华,但我对它一直有种敬而远之的感觉,因为一个不小心就可能让你的程序陷入莫名其妙的麻烦之中.所以,在处理字符串时,我总是能用 ...

  7. C语言指针专题——序

    看到好多的C语言初学者学到指针时,都觉得指针怎么那么难啊!我也想起了我当时学习指针时遇到的困难,确实很难!到底是教程写的不好呢,还是老师教的不好呢?我觉得都有. 网上搜索指针讲解的资料很多,我也看了不 ...

  8. 深入理解C语言 - 指针使用的常见错误

    在C语言中,指针的重要性不言而喻,但在很多时候指针又被认为是一把双刃剑.一方面,指针是构建数据结构和操作内存的精确而高效的工具.另一方面,它们又很容易误用,从而产生不可预知的软件bug.下面总结一下指 ...

  9. 深入理解C语言 - 指针详解

    一.什么是指针 C语言里,变量存放在内存中,而内存其实就是一组有序字节组成的数组,每个字节有唯一的内存地址.CPU 通过内存寻址对存储在内存中的某个指定数据对象的地址进行定位.这里,数据对象是指存储在 ...

随机推荐

  1. Ubuntu 下安装 Qt Designer

    1. apt-get install qt5-designer 2.终端下输入designer,显示: designer: could not exec '/usr/lib/x86_64-linux- ...

  2. 59: loj #10215

    $des$ https://loj.ac/problem/10215 $sol$ exgcd检查 $code$ #include <iostream> #include <cstdl ...

  3. 一起学Makefile(三)

    makefile工具箱 complicated项目的构建 文件结构如下: 文件内容如下: 项目依赖关系: gcc编译出可执行文件的过程包含了两个过程,编译和链接. makefile如下: 运行结果:

  4. module 'torch' has no attribute 'gesv'

    新版torch不支持gesv,使用solve函数. Kt, _ = torch.gesv(P.mm(H.t()).t(), S) 改成 Kt, _ = torch.solve(P.mm(H.t()). ...

  5. ubuntu笔记2-误删dpkg的/var/lib/dpkg/info文件夹

    由于误删了dpkg的/var/lib/dpkg/info文件夹,导致安装文件的时候报错 错误提示:E: Sub-process /usr/bin/dpkg returned an error code ...

  6. kubernetes --- Glusterfs

    gluster配额管理gluster volume quota cloud enablegluster volume quota cloud limit-usage /mail/pbs 20MBdd ...

  7. 【技术博客】MySQL和Django常用操作

    MySQL和Django是搭建网站常用的配置之一,在此记录一下在Windows系统搭建网站时MySQL以及Django常用的操作. MySQL MySQL的SQL语句不区分大小写,推荐将保留字大写,数 ...

  8. 【Beta】发布说明

    再次号外!Visual Pytorch第二个版本上线了! 目前的网址在这里(http://114.115.151.39/) 哦 有关上一版本的功能介绍说明请参考博客:Visual Pytorch -- ...

  9. 冰多多团队-第六次Scrum会议

    冰多多团队-第六次Scrum会议 工作情况 团队成员 已完成任务 待完成任务 zpj ASR bug修复 接入IAT模块 牛雅哲 完成语音识别->词典->termux的接口设计,熟悉了语法 ...

  10. 【转】聊聊并发(一)——深入分析Volatile的实现原理

    即两个或多个进程读写某些共享数据,而最后的结果取决于进程运行的精确时序,称为竞争条件(race condition). 引言 在多线程并发编程中synchronized和Volatile都扮演着重要的 ...