在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语言的一种特殊变量
  • 指针所保存的值是内存的地址
  • 可以通过指针修改内存中其他地址的内容(有些内存地址处是无法修改的)

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

  1. 【C语言进阶深度学习记录】十九 #pragma使用与分析

    文章目录 1 #pragma 概念简介 1.1 #pragma message 的用法 1.2 #pragma once 的用法 1.3 #pragma pack 的用法 1.31 struct占用的 ...

  2. 【C语言进阶深度学习记录】十二 C语言中的:字符和字符串

    文章目录 1 C语言中的单引号和双引号 1.1 双引号带来的BUG 2 总结 1 C语言中的单引号和双引号 C语言中的单引号用来表示字符字面量 C语言中的双引号用来表示字符串字面量,存储于全局的只读存 ...

  3. 【C语言进阶深度学习记录】十六 静态库与动态库的创建与使用

    上一篇文章学习了编译的过程,点击链接查看:[C语言进阶深度学习记录]十五 编译过程简介,每一个C源文件编译后将会生成目标文件,那么这些目标文件,还需要链接起来,生成可执行文件. 文章目录 1 链接的意 ...

  4. 【C语言进阶深度学习记录】十五 编译过程简介

    文章目录 1 初识编译器 2 总结 1 初识编译器 我们平时口中所说的编译器,是广泛的编译器.实际上,编译器包括了以下四个部分: 一个C代码被编译为可执行代码,包括以下几个过程: 下面就对上述的各个过 ...

  5. 【C语言进阶深度学习记录】十四 C语言中 三目运算符和逗号表达式

    文章目录 1 三目运算符 1.1 三目运算符的返回类型的代码案例分析 2 逗号表达式 2.1 逗号表达式代码案例分析 2.2 如何用一行代码实现 strlen函数 3 总结 1 三目运算符 三目运算符 ...

  6. 【C语言进阶深度学习记录】十 C语言中:struct的柔性数组和union分析

    本文并不讲C语言的基础 文章目录 1 空struct的大小 2 结构体与柔性数组 2.1 柔性数组的使用方法 2.2 柔性数组使用代码案例分析 3 C语言中的union分析 3.1 使用union判断 ...

  7. 【C语言进阶深度学习记录】十八 条件编译的使用与分析

    文章目录 1 基本概念 1.1 代码分析 1.2 通过命令行定义宏 2 #include 的本质 2.1 解决重复包含头文件的问题 3 条件编译的应用 4 总结 1 基本概念 条件编译的行为类似于C语 ...

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

    之前有一篇文章是学习了字符和字符串的,可以与之结合学习:[C语言进阶深度学习记录]十二 C语言中的:字符和字符串 文章目录 1 字符串的概念 1.1 字符串与字符数组 1.2 字符数组与字符串代码分析 ...

  9. 【C语言进阶深度学习记录】三十五 程序中的堆、栈以及静态存储区(数据区)

    学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 在我之前学习底层的知识的时候,也写过相关的内容.可以对比的学习:[软 ...

  10. 【C语言进阶深度学习记录】三十八 C/C++语言中的函数声明与函数定义

    文章目录 1 函数的声明和定义 1.1 代码分析 2 总结 1 函数的声明和定义 声明的意义在于告诉编译器程序单元的存在.只是告诉编译器它存在但是不在声明这里定义,有可能在当前文件中的其他地方或者其他 ...

最新文章

  1. 18个Java8日期处理的实践,太有用了!
  2. 对移动APP开发的需求分析的观点及见解
  3. python 生意参谋_GitHub - iOSDevLog/sycm: 生意参谋
  4. 【face-landmarks】人脸关键点检测汇总
  5. html5 type submit,input type=submit
  6. cocos2d-x+lua开发模式下编辑器的选择
  7. 在线编程语言模拟(Java,C,Python,R语言,Ruby,PHP,Perl,Go等)
  8. Windows下能PING通网关不能打开网页解决方法
  9. ---转载---phython资料
  10. Windows/Mac系统MySQL,MySQL驱动下载和安装
  11. 软件测试如何制作简历?
  12. 【知识图谱】08KBQA问答系统(python+fuseki+jena)
  13. HTML5期末大作业:绿色特产商城网站设计——绿色特产商城购物网(11页) HTML+CSS+JavaScript 网页设计作业,网页制作作业, 学生网页作业, 网页作业成品, 网页作业模板
  14. 淘宝618超级喵运会怎么玩 如何获取喵币?
  15. 微信小程序弹窗提示怎么写
  16. TotalCommander查看文件夹大小和文件夹排序
  17. 微信小程序开发教程——1.0.1appid注册和开发者工具下载
  18. 第一性原理计算软件攻略-利用VESTA绘制差分电荷密度图解
  19. php trum,口碑曝光TrumoAurora评测如何?怎么样呢?使用报告曝光评测
  20. 北京住房公积金提取(取消)指南

热门文章

  1. 灰度重采样(Gray Resampling
  2. centos7安装samba服务器
  3. FPGA Verilog实现一个脉冲波形变换
  4. 整理一下网上看到的几个巧妙小电路
  5. 树莓派移植SX1278 LoRa通信--使用wiringPi 移植GPIO中断
  6. Linux scp 免密码 传输文件
  7. excel服务器2010网站,excel服务器2010
  8. t3修改计算机后就无法登录了,电脑更换系统后,用友T3登录不上了,一直显示这个,怎么处理,这个怎么解决...
  9. 二进制安装mysql-5.7.26
  10. [02] JSP内置对象