【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语言的一种特殊变量
- 指针所保存的值是内存的地址
- 可以通过指针修改内存中其他地址的内容(有些内存地址处是无法修改的)
【C语言进阶深度学习记录】二十二 指针的本质分析相关推荐
- 【C语言进阶深度学习记录】十九 #pragma使用与分析
文章目录 1 #pragma 概念简介 1.1 #pragma message 的用法 1.2 #pragma once 的用法 1.3 #pragma pack 的用法 1.31 struct占用的 ...
- 【C语言进阶深度学习记录】十二 C语言中的:字符和字符串
文章目录 1 C语言中的单引号和双引号 1.1 双引号带来的BUG 2 总结 1 C语言中的单引号和双引号 C语言中的单引号用来表示字符字面量 C语言中的双引号用来表示字符串字面量,存储于全局的只读存 ...
- 【C语言进阶深度学习记录】十六 静态库与动态库的创建与使用
上一篇文章学习了编译的过程,点击链接查看:[C语言进阶深度学习记录]十五 编译过程简介,每一个C源文件编译后将会生成目标文件,那么这些目标文件,还需要链接起来,生成可执行文件. 文章目录 1 链接的意 ...
- 【C语言进阶深度学习记录】十五 编译过程简介
文章目录 1 初识编译器 2 总结 1 初识编译器 我们平时口中所说的编译器,是广泛的编译器.实际上,编译器包括了以下四个部分: 一个C代码被编译为可执行代码,包括以下几个过程: 下面就对上述的各个过 ...
- 【C语言进阶深度学习记录】十四 C语言中 三目运算符和逗号表达式
文章目录 1 三目运算符 1.1 三目运算符的返回类型的代码案例分析 2 逗号表达式 2.1 逗号表达式代码案例分析 2.2 如何用一行代码实现 strlen函数 3 总结 1 三目运算符 三目运算符 ...
- 【C语言进阶深度学习记录】十 C语言中:struct的柔性数组和union分析
本文并不讲C语言的基础 文章目录 1 空struct的大小 2 结构体与柔性数组 2.1 柔性数组的使用方法 2.2 柔性数组使用代码案例分析 3 C语言中的union分析 3.1 使用union判断 ...
- 【C语言进阶深度学习记录】十八 条件编译的使用与分析
文章目录 1 基本概念 1.1 代码分析 1.2 通过命令行定义宏 2 #include 的本质 2.1 解决重复包含头文件的问题 3 条件编译的应用 4 总结 1 基本概念 条件编译的行为类似于C语 ...
- 【C语言进阶深度学习记录】二十六 C语言中的字符串与字符数组的详细分析
之前有一篇文章是学习了字符和字符串的,可以与之结合学习:[C语言进阶深度学习记录]十二 C语言中的:字符和字符串 文章目录 1 字符串的概念 1.1 字符串与字符数组 1.2 字符数组与字符串代码分析 ...
- 【C语言进阶深度学习记录】三十五 程序中的堆、栈以及静态存储区(数据区)
学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 在我之前学习底层的知识的时候,也写过相关的内容.可以对比的学习:[软 ...
- 【C语言进阶深度学习记录】三十八 C/C++语言中的函数声明与函数定义
文章目录 1 函数的声明和定义 1.1 代码分析 2 总结 1 函数的声明和定义 声明的意义在于告诉编译器程序单元的存在.只是告诉编译器它存在但是不在声明这里定义,有可能在当前文件中的其他地方或者其他 ...
最新文章
- 18个Java8日期处理的实践,太有用了!
- 对移动APP开发的需求分析的观点及见解
- python 生意参谋_GitHub - iOSDevLog/sycm: 生意参谋
- 【face-landmarks】人脸关键点检测汇总
- html5 type submit,input type=submit
- cocos2d-x+lua开发模式下编辑器的选择
- 在线编程语言模拟(Java,C,Python,R语言,Ruby,PHP,Perl,Go等)
- Windows下能PING通网关不能打开网页解决方法
- ---转载---phython资料
- Windows/Mac系统MySQL,MySQL驱动下载和安装
- 软件测试如何制作简历?
- 【知识图谱】08KBQA问答系统(python+fuseki+jena)
- HTML5期末大作业:绿色特产商城网站设计——绿色特产商城购物网(11页) HTML+CSS+JavaScript 网页设计作业,网页制作作业, 学生网页作业, 网页作业成品, 网页作业模板
- 淘宝618超级喵运会怎么玩 如何获取喵币?
- 微信小程序弹窗提示怎么写
- TotalCommander查看文件夹大小和文件夹排序
- 微信小程序开发教程——1.0.1appid注册和开发者工具下载
- 第一性原理计算软件攻略-利用VESTA绘制差分电荷密度图解
- php trum,口碑曝光TrumoAurora评测如何?怎么样呢?使用报告曝光评测
- 北京住房公积金提取(取消)指南
热门文章
- 灰度重采样(Gray Resampling
- centos7安装samba服务器
- FPGA Verilog实现一个脉冲波形变换
- 整理一下网上看到的几个巧妙小电路
- 树莓派移植SX1278 LoRa通信--使用wiringPi 移植GPIO中断
- Linux scp 免密码 传输文件
- excel服务器2010网站,excel服务器2010
- t3修改计算机后就无法登录了,电脑更换系统后,用友T3登录不上了,一直显示这个,怎么处理,这个怎么解决...
- 二进制安装mysql-5.7.26
- [02] JSP内置对象