小猪的C语言快速入门系列(五)
小猪的C语言快速入门系列(五)
标签: C语言
本节引言:
上一节我们C语言 复合数据类型
中的 数组
进行了解读,本节我们会继续来学习
复合数据类型中的 指针
,指针可是C语言的灵魂;利用指针可以表示与使用复杂的
数据结构,让我们可以更加方便的使用数组与字符串;可以像汇编一样直接处理内存
单元地址;可以动态地进行内存空间分配;指针是C语言的重点,也是难点。
本节学习路线图
指针概念,指针与一维数组和字符串
指针与二维数组
这个知识点是指针里的难点,要弄懂这里的话,我们要先把重心放到二维数组上,先
彻底了解清楚二维数组!
Step 1:二维数组是
按行与列存储数据的
,可以看成 若干行 + 每行若干列的一维数组组成;
比如:int a3 = {{1,2,3,4},{1,2,3,4},{1,2,3,4}}; 可以看成三行,每行有四个一维数组;Step 2:a 代表二维数组
首元素的地址
,即 &a[0],如果换成数组的第二,三行的话,
只需要把 a + 1,a + 2这样,等价于&a1,&a2Step 3:我们可以把 a[0] 看做是指向 a[0][0] 的指针,那么 a[0]+1 即指向 a[0][1]
即此时地址为:&a[0][1]PS:这里的+1的1是数组元素所占的字节数,比如int a[]的话,那么这个+1代表的就是往后
移动4个字节,指向下一个元素;如果是+2的话就是后移8个字节,所以a[i][2] = a[i] + 2Step 4:通过前面一维数组的学习,知道了 a[i] 等价于 *(a+i),同样的,扩展到
二维数组的情况,则有a[i][j]
与*(a+i)+j
和a[i]+j
都是等价的,都是表示数组元素
a[i][j] 的地址,而求a[i][j]的值
,用*(a[i]+j)
与*(*(a+i)+j)
都是可以的
注意一点:
*a
与 *(a+i)
都不代表任何具体的数据元素,所以当你引用他们的时候可能会引起错误!
如果上面的内容都捋清楚了,下面这几个点一清二楚了:
- 1.数组首地址
a[0]
: a 不可以直接引用!!! - 2.一维数组a[0]首元的地址(
&a[0][0]
):a[0],*(a+0),*a
; - 3.第一行的首地址: a + 1 同样不可以直接应用
- 4.一维数组a1首元的地址
(&a[1][4])
:a[1]
,*(a + 1)
- 5.序号为2行4列元素
a[2][5]
的地址:a[2]+4
,*(a+2)+4
,a[2][6]
使用代码示例:
示例1:指向数组元素
#include <stdio.h>
int main()
{int a[2][2] = {{1,2},{3,4}};int *p,i,j;p = a[0];//p = &a[0][0]或*a也可以printf("输出数组中所有的元素:\n");for(i = 0;i < 2; i++) {for(j = 0;j < 2;j++) {printf("%4d",*p);p++;}printf("\n");}return 0;
}
输出结果:
示例2:指向数组
#include <stdio.h>
int main()
{int i,j;int a[4][9];//定义一个行指针,并指向数组的首地址int (*p)[4];p = &a[0];printf("请输入二维数组中的数组元素:\n");for(i = 0;i < 4;i++) {for(j = 0;j < 4;j++){scanf("%d",p[i]+j);}}printf("输出二维数组中的数据:\n");for(i = 0;i < 4;i++) {for(j = 0;j < 4;j++){printf("%4d",*(p[i]+j));}printf("\n");}return 0;
}
输出结果:
本文链接:小猪的C语言快速入门系列(五)
作者:Coder-Pig
出处:http://blog.csdn.net/coder_pig
本文基于知识共享署名-相同方式共享 4.0 国际许可协议发布,欢迎转载,
演绎或用于商业目的,但是必须保留本文的署名及链接。
小猪的C语言快速入门系列(五)相关推荐
- 小猪的C语言快速入门系列(三)
小猪的C语言快速入门系列(三) 标签: C语言 本节引言: 在上一节中,对C语言的基本语法进行了学习,类比成学英语的话,我们现在 只是会单词而已,组成一个个句子还需要学习一些语法,本节学习的就是两对 ...
- 小猪的C语言快速入门系列(一)
小猪的C语言快速入门系列(一) 标签: C语言 本系列教程引言: C语言 作为大学编程或者计算机专业的一门必修课,把很多初学编程的小伙伴 都难住了,感觉无从下手,本套教程就是为此而诞生的.教程会把 C ...
- 小猪的C语言快速入门系列(二)
小猪的C语言快速入门系列(二) 标签: C语言 本节引言 在上一节中,对于C语言有了一个初步的了解,学会了如何使用IDE来进行 代码编写,编译和运行.而这一节,我们会对C语言的基本语法进行学习, C语 ...
- RHEL8.0快速入门系列笔记--计划任务服务crond(十五)
RHEL8.0快速入门系列笔记–计划任务服务crond(十五) 1.了解计划任务的作用 作用:释放我们的双手,释放我们的时间 计划任务,让系统在将来的指定时间点执行某些任务(程序) 计划任务,可以周期 ...
- 视频教程-做游戏学Python-Python语言快速入门-Python
做游戏学Python-Python语言快速入门 20年软件项目开发管理经验 工信部人才交流中心特聘专家讲师 日本U-CAN在线教育特聘主任讲师 国家十二·五规划软件工程教材作者(书:清华大学出版社出版 ...
- Common Lisp语言快速入门
zhezhelin Common Lisp语言快速入门 Lisp是软件领域的分裂力量.一方面,Lisp爱好者誓言Lisp比软件领域内的其它语言都更加快捷.整洁和强大:而反对者则辩称,不可靠的执行和库支 ...
- c# wpf listbox 高度_WPF快速入门系列(1)——WPF布局概览
一.引言 关于WPF早在一年前就已经看过<深入浅出WPF>这本书,当时看完之后由于没有做笔记,以至于我现在又重新捡起来并记录下学习的过程,本系列将是一个WPF快速入门系列,主要介绍WPF中 ...
- 2021-08-26 转载 Scala快速入门系列博客文章
作者:Huidoo_Yang 出处:http://www.cnblogs.com/yangp/ 本文版权归作者Huidoo_Yang和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面 ...
- RHEL8.0快速入门系列笔记--理论知识储备(一)
RHEL8.0快速入门系列笔记–理论知识储备(一) 红帽公司发布Linux8.0系统已经有一段时间,最近准备学习关于RHEL8.0的相关新特性.根据官方介绍:RHEL8.0在云/容器化工作负载方面做了 ...
最新文章
- pandas使用reindex函数为日期索引中有缺失日期的dataframe进行索引重置(所有日期都连续)、并使用fill_value参数为行进行默认填充
- shell expect的简单用法
- 明明表中有这个索引,但mysql的force index 无效?
- [Javascript] Deep Search nested tag element in DOM tree
- spring-data-jpa Specification构建动态ql
- P4585-[FJOI2015]火星商店问题【线段树,可持久化Trie】
- ThinkPHP 3.2.3 关联模型的使用
- 叮!您收到一份超值Java基础入门资料! 1
- InnoDB发展历史
- 安卓PHP maker汉化,android 百度地图marker添加自定义视图
- 结构体struct的定义和使用
- Python+OpenCV:直方图均衡化(Histogram Equalization)
- android计时器代码百度网盘下载,计时器flash_求几个简单Flash计时器,可以自己设定时间的,百度云...
- Visual Studio 2019 Community 版离线注册
- 彩虹的原理与绘制方法
- C++开发 一个壁纸小软件
- (凯思奥2020-03月)问题记录3,GUI问题记录3 4,国际化异常,微信平台接入 = 数据库修改 + 自动化填充 + 前后端接口修正 + 联调测试问题 + 微信与数字账号绑定 + 思考+部署
- 初始对准及组合导航技术
- 求字符串中的回文数或者是回文单词
- 项目管理笔记-第十三章 项目相关方管理