【C语言进阶深度学习记录】二十二 指针的本质分析

在C语言中,最难的也就是指针了。如果我们了解了指针的本质,它就会变得简单

文章目录

    • 1 回顾:什么是变量?
      • 1.1 *号的意义
      • 1.2 指针使用示例
    • 2 传值调用与传址调用
      • 2.1 利用指针交换两个变量
    • 3 const与指针的配合
      • 3.1 const指针代码分析
    • 4 总结

1 回顾:什么是变量?

程序中的变量只是一段存储空间的别名,那么是不是必须通过这个别名才能使用这段存储空间呢?

如果有一定的C语言的基础,那么应该知道还可以通过指针来访问变量的内存。就像下图中的代码片段:

在这里插入图片描述

1.1 *号的意义

  • 在指针声明的时候,*号表示所声明的变量是指针
  • 在指针使用时,*号表示取指针所指向的内存空间的值

如下图所示:
在这里插入图片描述

变量p保存的是变量i的地址。*p是i的值。如下图:
在这里插入图片描述

1.2 指针使用示例

  • 代码:26-1-lyy.c
#include <stdio.h>int main(){int  i = 0;int* pI;char* pC;float* pF;pI = &i;*pI = 10;printf("%p, %p, %d\n", pI, &i, i);printf("%d, %d, %p\n",sizeof(int*), sizeof(pI), &pI);printf("%d, %d, %p\n",sizeof(char*), sizeof(pC), &pC);printf("%d, %d, %p\n",sizeof(float*), sizeof(pF), &pF);return 0;
}

运行结果如下(Linux gcc 4.4.5):

在这里插入图片描述

通过上述的代码以及运行结果分析知:

  • 在32位系统中,指针的大小都是4。这个其实很好理解。32位系统只需要32位的地址,就能寻址所有内存空间。

2 传值调用与传址调用

因为指针也是变量,所以函数的参数可以为指针。

  • 当一个函数体内需要改变实参的值,则需要传该实参的地址。
  • 当传入的参数为复杂的数据类型的时候,也需要使用指针来作为参数

2.1 利用指针交换两个变量

  • 代码:26-2-lyy.c
#include <stdio.h>void swap(int* a, int* b){int tmp = *a;*a = *b;*b = tmp;
}int main(){int aa = 1;int bb = 2;printf("aa = %d, bb = %d\n", aa, bb);swap(&aa, &bb);printf("aa = %d, bb = %d\n", aa, bb);return 0;
}
  • 编译运行结果如下:

在这里插入图片描述

3 const与指针的配合

在这里插入图片描述

总结来说就是:

  • 当const出现在 *号左边的时候,指针指向的数据不可改变,但是指针本身的值可以改变。
  • 当const出现在 *号右边的时候,指针本身不能改变但是它指向的数据可以改变

3.1 const指针代码分析

  • 如下面的代码:26-3-lyy.c
#include <stdio.h>int main()
{int i = 0;const int* p1 = &i;int const* p2 = &i;int* const p3 = &i;const int* const p4 = &i;*p1 = 1;    // compile errorp1 = NULL;  // ok*p2 = 2;    // compile errorp2 = NULL;  // ok*p3 = 3;    // okp3 = NULL;  // compile error*p4 = 4;    // compile errorp4 = NULL;  // compile errorreturn 0;
}
  • 上面代码中标注ok的就是正确的代码,标注compile error的就是编译会出错的代码。
  • 对比上面的关于const的规则看上面的代码,很容易理解各行代码为什么出错,为什么不出错。

4 总结

  • 指针是C语言的一种特殊变量
  • 指针所保存的值是内存的地址
  • 可以通过指针修改内存中其他地址的内容(有些内存地址处是无法修改的)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422805.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端学习(284):纯css实现翻书效果

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>纯css3实现翻书效果</title><link href"reset.css" rel"stylesheet" type"text/css"><style>body {…

【C语言进阶深度学习记录】二十三 数组的本质分析

文章目录1 数组的概念1.1 数组的大小1.2 数组的初始化2 数组的地址与数组名3 数组名不能作为左值使用4 总结1 数组的概念 数组是相同类型的变量的有序集合数组中的元素没有名字 如下图是一个数组&#xff1a; 1.1 数组的大小 数组的大小是数组元素个数乘以元素的数据类型数组…

【C语言进阶深度学习记录】二十四 指针与数组的本质分析一

文章目录1 回顾--数组的本质2 指针的运算2.1 指针运算代码案例分析3 指针的比较3.1 指针运算的应用代码案例分析4 总结1 回顾–数组的本质 在之前的文章&#xff0c;已经学习了数组的本质分析。下面再来回顾一下&#xff1a; 数组是一段连续的内存空间数组名可以看做是指向数…

【C语言进阶深度学习记录】二十五 指针与数组的本质分析二

文章目录1 数组的访问方式1.1 数组的访问方式代码分析2 数组和指针不同3 a 和 &a 的区别3.1 指针运算的经典代码案例分析4 数组作为函数的参数4.1 数组作为函数参数的代码案例分析5 总结开题问&#xff1a;数组名可以当做常量指针使用。那么指针是否可以当做数组来使用? …

设计模式_第二篇_策略模式

本文是我通过学习《Head First 设计模式》而写。 作为我要描述的第一个模式&#xff0c;首先要说什么是设计模式&#xff0c;然后&#xff0c;用一个实例&#xff0c;并对这个实例不断的改进&#xff0c;引出策略模式。 与其空泛地给出一堆描述&#xff0c;倒不如给出通过一个实…

【C语言进阶深度学习记录】二十六 C语言中的字符串与字符数组的详细分析

之前有一篇文章是学习了字符和字符串的&#xff0c;可以与之结合学习&#xff1a;【C语言进阶深度学习记录】十二 C语言中的&#xff1a;字符和字符串 文章目录1 字符串的概念1.1 字符串与字符数组1.2 字符数组与字符串代码分析2 字符串字面量2.1 字符串字面量的本质的代码分析…

3天搞定的小型B/S内部管理类软件定制开发项目【软件开发实战10步骤详解】

2010-10-07 21:39 by 通用权限组件源码, 16580 visits, 收藏, 编辑 十一休假&#xff0c;杭州西湖边逛了一圈只能用人山人海来形容&#xff0c;浙大紫金港校区也逛了一圈风景如画&#xff0c;建设得真不错很棒&#xff0c;假期就去了这2个地方&#xff0c;然后在家里陪老婆、看…

【C语言进阶深度学习记录】二十八 数组指针与指针数组的分析

数组指针与指针数是非常重要的概念。面试中也是经常会被问到的 文章目录1 数组的类型1.1 定义数组的类型2 数组指针2.1 数组类型和数组指针的代码分析3 指针数组3.1 指针数组代码案例分析4 总结1 数组的类型 C语言中的数组有自己特定的类型。比如 int a[5]&#xff1b; 数组a…

【C语言进阶深度学习记录】二十九 main函数与命令行参数

文章目录1 main函数的返回值2 main函数的参数2.1 main函数的参数的代码案例分析3 main函数不一定是程序中第一个执行的函数4 总结1 main函数的返回值 main函数是操作系统调用的函数操作系统总是将main函数的返回值作为程序的退出状态main函数的返回值正常来说是0&#xff0c;如…

【C语言进阶深度学习记录】三十 二维数组与二维指针

文章目录1 二维指针&#xff08;指向指针的指针&#xff09;2 二维数组3 二维数组的类型3.2 如何动态申请二维数组4 总结1 二维指针&#xff08;指向指针的指针&#xff09; 指针的本质是变量指针的指针是保存指针变量的地址。如下面的代码&#xff1a; 为什么需要指向指针的存…

【C语言进阶深度学习记录】三十一 数组作为函数参数时退化为指针

之前的学习数组的文章中&#xff0c;已经知道一维数组作为函数参数的时候&#xff0c;最终会被编译器编译为指针。今天来看看二维数组的情形 文章目录1 为什么C语言中的数组作为函数参数会退化为指针&#xff1f;2 二维数组作为函数参数如何退化2.1 代码案例分析&#xff08;传…

使用HTMLParser模块解析HTML页面

HTMLParser是python用来解析html和xhtml文件格式的模块。它可以分析出html里面的标签、数据等等&#xff0c;是一种处理html的简便途径。HTMLParser采用的是一种事件驱动的模式&#xff0c;当HTMLParser找到一个特定的标记时&#xff0c;它会去调用一个用户定义的函数&#xff…

前端学习(294):rem小实例

altz转换为rem <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compatible"…

【C语言进阶深度学习记录】三十二 函数指针与使用函数指针实现回调函数

回调函数是非常重要的概念 文章目录1 函数的类型2 函数指针2.1 函数指针的使用2.2 使用函数指针实现回调函数3 总结1 函数的类型 跟以前学数组的时候是一样的&#xff0c;C语言中的数组是有自己的类型的。函数也是有自己的类型的。 函数的类型由返回值、参数的类型、参数的个…

【C语言进阶深度学习记录】三十三 C语言中动态内存分配

如何在程序运行的时候动态给程序分配内存&#xff1f; 文章目录1 动态内存分配的意义1.1 C语言中如何动态申请内存空间1.2 malloc和free的用法1.3 calloc与realloc1.31 calloc和realloc的代码案例分析2 总结1 动态内存分配的意义 在C语言中&#xff0c;一切操作都是基于内存的…

java并发实战

推荐一个Java并发编程实战的学习专栏。此专栏为极客时间收费专栏。 学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群 &#xff1a; 962535112 对于一个 Java 程序员而言&#xff0c; 能否熟练掌握并发编程是判断他优秀与否的…

a critical review of preetham skylight model 笔记

也是为了试用下Xmind。 上图是我用Xmind作的某篇文章的笔记。 感想&#xff1a; 1. 之以一直觉得这种东西没多大用处&#xff0c;回想起来大概是因为那时没有太多应用场景。 2. 如果留心&#xff0c;可以把许多事情做得更漂亮、更容易&#xff0c;这也是工具的用途。 贴一下软件…

【C语言进阶深度学习记录】三十四 C语言实现内存泄漏检测模块

上一篇文章学习了malloc系列的三个函数的使用。众所周知malloc的使用很容易导致内存泄漏。本文的目的就是使用C语言来实现内存泄漏检测模块&#xff0c;来帮忙自动检测我们写的程序中是否出现内存泄露。 文章目录1 内存泄露检测模块的实现原理1.1 各个函数模块的设计1.2 模块整…

重学前端----前端知识系统学习推荐专栏

推荐一个前端知识学习专栏。此专栏为极客时间收费专栏。 学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 文章目录1 概述2 专栏内容2.1 模块一&#xff0c;JavaScript2.2 模块二&#xff0c;HTML 和 …