关于指针的基本概念及相关运算写在了上一篇博客

C语言指针详解(初级)_Seinrich的博客-CSDN博客

本篇博客来详细的解说一下指针,深入探讨指针

一、指针与const

const修饰的变量为常变量,其内的值不可以修改,如

const int i = 0;// 或 int const i = 0; 一般const放前

则变量i中的数据只能为0,不可修改,但是i的本质仍为变量,所以叫常变量

当const修饰对象是指针时,根据其所在位置不同,含义也不同

//一个const,在*前

const int i = 0;

const int a = 10;

const int* p = &i;  //或为 int const* p = &i;

*p = 1; //错误,p指向常整形,不可修改其数据

p = &a; //改变p的指向

在这里,指针p指向一个const int类型变量,此时不能通过解引用的方式对i中的数据进行修改,但是p可以改变指向,如最后一行的代码,p中的地址由变量i的地址更改为变量a的地址,指向改变。实际上就是改变了指针变量p中的值。

//一个const,在*后

int a = 0, b = 10;

int* const p = &a;

*p = 100;  //此时a中的数据被修改为100

p = &b; //错误,p指向固定,不可修改指向

在这里,指针变量p中的存放的地址固定,其指向内存空间不可修改,但是可以通过解引用的方式修改其所指变量中的数据。此时p指向的是一个int类型的变量,const修饰变量p,固定其指向,其内的值不可修改

//两个const,一前一后

const int a = 0;

const int* const p  = &a;

在这里,p的指向固定,且指向const int类型的变量,p的指向不可修改,指向变量的值不可修改

总结就是

const在*前,不可解引用修改数据

const在*后,不可改变指针指向

const在*前*后都有,指针不能解引用修改数据也不能改变指向

二、字符指针

在指针类型中有一种字符指针:char*

一般有以下两种使用方式

char ch = 'a';

char* pc = &a;

*pc = 'b';

或者是

const char* pstr = "hello world";

第一种使用方式很好理解,首先在内存开辟1字节大小的空间用以存放变量ch中的数据,然后再由一个pc的字符指针存放变量ch的地址。之后通过指针解引用修改数据

第二种使用方式是用一个pstr的字符指针指向一个字符串常量,编译器也会在内存开辟一块连续的区域存放这一字符串常量,而pstr中存放的是字符串首字符的地址,也就是pstr中存放的是该字符串中字符‘h’的地址

三、多级指针与指针数组

多级指针,如二级、三级指针等。指针指向的是某变量的地址,二级指针指向一级指针的地址,三级指针指向二级指针的地址,以此类推。一般很少用到三级及以上指针,二级指针也不常用。

指针数组,本质是数组,里面的元素是指针,如

int* arr[10];

这就是一个容量为10的可存放int*类型指针的一个数组。本质上是运算符优先级的问题,因为[]运算符比*运算符优先级高,所以arr先和[]结合,成为数组

四、数组指针

数组指针,本质是指针,指向一个数组,如

int arr[10];

int (*p)[10] = &arr;

这里由于(),导致p先和*结合,成为指针,该指针指向一个容量为10,元素类型为int的数组arr

数组名与&数组名

一般情况下,数组名是该数组中首元素的地址,只有在&和sizeof作用下时,数组名才表示整个数组,如下代码

int arr[3] = {1,2,3};
printf("%d",sizeof(arr)); //打印整个数组的大小

int arr[3] = {1,2,3};

int (*p)[3] = &arr;

int* pi = arr;

&数组名,取出的是整个数组的地址,存入数组指针中的仍是首元素地址,但指针数组的步长是整个数组大小,而指针pi的步长是一个int变量的大小

五、函数指针

函数指针是指向函数的指针,用于函数回调,如C语言内置库函数中qsort(快速排序),就使用到了函数指针。

void function(int x, int y)
{//.......
}void (*p)(int,int) = &function;

这里的p就是一个函数指针,指向一个返回值为void,参数为两个int的function函数。

C语言指针详解(全解)—— 前篇相关推荐

  1. c语言的指针详解ppt,最全的C语言指针详解.ppt

    最全的C语言指针详解.ppt 第6章 指针,6.1 指针定义与使用 6.2 指针与函数 6.3 指针与数组 6.4 指针与字符串 6.5 指针数组与多级指针 6.6 指针与动态内存分配 6.7 指针的 ...

  2. C语言指针详解——入门C语言指针,初级指针使用。

    原文地址:我的个人博客点击查看 C语言教程第二弹--指针详解 所有学过C语言的人都知道,C语言难在它的指针的使用和理解,今天,我带给大家C语言的指针的教程,供大家学习交流,如果有讲的不对的地方,请给作 ...

  3. c语言 指针函数 详解,[NOTE-C]C语言指针详解(一)

    C语言指针让一切想法变成可能,强转和指针可以看做一项呼风唤雨的利器,但是C语言中指针应用又需要格外的小心,其更灵活的利用内存,因为不当的应用可能引起各种异常,这篇文章就是让我们一起来认识C指针,更好的 ...

  4. 导航编程用c语言还是c加加,C语言/C加加大神程序员老司机带你玩转C语言指针详解...

    很多初学编程的小伙伴都会选择C语言作为第一门学习的编程语言,因为C语言作为一门底层基础语言相对于其他的高层语言来说更加容易学习.可以来帮助正在学习编程的小伙伴更加快速的了解计算机原理. 但是初学C语言 ...

  5. c语言 指针_C 语言指针详解

    (给CPP开发者加星标,提升C/C++技能) 作者:C语言与CPP编程 / 自成一派123(本文来自作者投稿) 1为什么使用指针 假如我们定义了 char a='A' ,当需要使用 'A' 时,除了直 ...

  6. c语言高低位拷贝_C语言指针详解

    1为什么使用指针 假如我们定义了 char a='A' ,当需要使用 'A' 时,除了直接调用变量 a ,还可以定义 char *p=&a ,调用 a 的地址,即指向 a 的指针 p ,变量 ...

  7. C语言指针详解(初级)

    一.指针是什么 在计算机内存中,每一个内存单元都有其对应的地址,用以标识该单元.就如同小区的楼号.门牌号具体定位到每个户主一样,计算机通过这个地址来标识每一个内存单元.一个内存单元的大小是1个字节,里 ...

  8. C语言指针详解——后篇

    目录 一.指针与数组 ​编辑 二.数组传参 2.1一维数组传参 2.2二维数组传参 三.函数指针及应用 四.函数指针数组 一.指针与数组 先来看以下代码及运行的结果 #include <stdi ...

  9. C语言指针详解(新手入门推荐)

    目录 指针的理解 字符指针:char * 无类型指针void * 指针数组 数组指针 函数指针 回调函数 函数指针数组 练习 指针和数组笔试题解析 指针的理解 关于指针,我先讲一个故事:一个侦探在案发 ...

最新文章

  1. sql server 游标的使用
  2. 用Java或Jsp向数据库存取二进制图片
  3. Spark常用RDD算子 - saveAsTextFile、saveAsObjectFile 可保存到本地文件或hdfs系统中
  4. P1574: [Usaco2009 Jan]地震损坏Damage
  5. 四种转换方式:自动,强制,Parse,Convert
  6. 52单片机定时器2使用(C语言程序)
  7. 基于 c++ 语言的简易 vim 编辑器
  8. windows下的文件遍历(使用CFindFile)
  9. layer 刷新某个页面
  10. Python学习笔记010——匿名函数lambda
  11. 如何在MyEclipse 中将工程已经删除的文件恢复过来
  12. Atitit cko之道首席知识官之道 attilax著 艾龙著 1. 2 2. 第 1 章 知识管理到底是什么,有什么用/1 2 3. 1.1 知识管理全景/1 1.2 波士顿矩阵/3 1.2.
  13. windows下FreeImage编译
  14. 群辉linux系统搭建网站,群晖折腾 篇一:群晖Web Station 功能搭建属于自己的照片分享网站...
  15. 中国本土八大会计师事务所简介
  16. 清华大学最新科研进展汇总(2020-2021年)
  17. 汤姆猫炫跑鸿蒙,汤姆猫炫跑最新版下载|汤姆猫炫跑新版本下载 安卓版 v1.4.0.470- 游娱下载站...
  18. OHS 12C中导入第三方SSL证书
  19. Linux下忘记root密码重置过程笔记
  20. Probabilistic PolynomialTime Algorithm概率多项式时间算法ppt算法的个人理解

热门文章

  1. Python基础学习-1-廖雪峰课程-Python的数据类型和面向对象
  2. 看完跳槽少说涨 5 K,前端面试从准备到谈薪完全指南(近万字精华)
  3. nvme协议 sata接口_SATA通道的M.2接口 到底支持Nvme固态硬盘吗?
  4. 为什么同尺寸同分辨率IPS屏效果有差别?如何区别?
  5. 安卓中的NonNull和Nullable及遇到的问题
  6. IT项目管理主要知识点
  7. mPaas-如何排查离线包(H5应用/小程序)无法更新的问题
  8. AWD平台搭建(Cardinal 从零开始) 2021/11/17
  9. 郑州大学校园网连接有线网Linux和windows还有mac系统
  10. jxls对比_罗技MX Keys与K780对比