C语言复习篇之数组与指针
C语言复习篇之数组与指针
学习了一段时间的嵌入式linux了,学习中有很多的东西需要总结,有经验有教训,我觉得把他写下来会更好,就当做是一种笔记的形式,记录学习中的点点滴滴,不仅仅自己可以经常复习,也可以提供来让别人共享的知识。这对自己来说其实是一种财富。不过说明一点,这只是笔记也许有些是摘至别处,有些是自己的想法,不保证每一句话都是自己说的。
今天的复习内容是数组与指针:
“嵌入式的学习中C语言是基础中的基础,是重中之重,也许许多人看到基础两个字就本能的反应:简单、不重要,恰恰相反,基础的东西才是最重要的东西,它决定了“上层建筑”是否牢固、可靠。”
好了废话不多说,复习开始了。
“指针是C语言的灵魂”这是所有学习C语言的大家所公认的一点。所以学好C,就必须玩转指针,因为C语言中最精华最奥妙最难搞清楚的莫过于指针了,特别是当指针和数组他们两个厮混在一起的时候,当然我觉得数组也可以理解为被束缚了的指针。
首先,理解概念:“指针”是指地址(俗称门牌号),是常量,通过指针的指示电脑可以找到需要的东西;“指针变量”是指存放地址的一个变量;“数组”是指存放具有相同属性的地址空间连续的的元素的集合。
指针使用注意项:
1.要理解指针,有四个点:指针的类型,指针指向的内容的类型,指针的值或
者叫指针所指向的内存区,指针本身所占用的内存区。
首先声明几个指针:(1)int*ptr; (2)char*ptr; (3)int**ptr; (4)int(*ptr)[3];
(5)int*(*ptr)[4];
指针类型:你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。
这是指针本身所具有的类型。让我们看看例一中各个指针的类型:
(1)int*ptr;//指针的类型是int*
(2)char*ptr;//指针的类型是char*
(3)int**ptr;//指针的类型是int**
(4)int(*ptr)[3];//指针的类型是int(*)[3]
(5)int*(*ptr)[4];//指针的类型是int*(*)[4]
指针指向的类型:你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩
下的就是指针所指向的类型。
例如: (1)int*ptr;//指针所指向的类型是int
(2)char*ptr;//指针所指向的的类型是char
(3)int**ptr;//指针所指向的的类型是int*
(4)int(*ptr)[3];//指针所指向的的类型是int()[3]
(5)int*(*ptr)[4];//指针所指向的的类型是int*()[4]
指向任意类型的指针它本身的大小(sizeof (ptr))只占4个字节
数组使用注意项:
1.数组名是地址常量,不能改变本身的值,比如自加自减等操作。
2.遵循先定义后使用的原则。数组不能整体赋值,除非初始化的时候。
3.(C99新特性)变长数组VLA,是指用×××变量或表达式声明或定义的数组
,而不是说数组的长度会随时变化,变长数组在其生存期内的长度同样是
固定的。
4.结构体柔性数组成员,即结构体的最后一个元素允许是未知大小的数组。
例:typedef struct A
{
int a;
double b;
char c[]; //必须是最后一位成员。
}test_t;
数组c不占用结构体A的空间(sizeof(A)=sizeof (int)+sizeof(double)),只是作为一个符号地址存在,,因此我们可以进行变长操作,如
下:
test_t *p=(test_t *)malloc(sizeof(test_t))+50*sizeof(char);
多分配出来的空间依然不占用结构体空间,仅提供给变长数组使用。
数组与指针的混合使用:
一维数组int a[3];
a[0] |
a[1] |
a[2] |
... |
... |
数组中内存地址是连续的。a为常量,代表数组首元素地址,a+1数组第二个元素的地址,&a数组首地址,&a+1数组外下一地址。
二维数组:int a[2][3]
a代表数组首元素地址,也代表第0行元素的首地址即&a[0],事实上当我们打印*a和*a[0]的值的时候,所得的结果都是一样的。当初想到这里我就有了一个疑问了:(?????)既然a和a[0]的值都是一样的,也就是说指向的地址是一样的,为什么a是表示a[0]而不是表示a[0][0]呢?
后来问过老师才知道,是因为虽然他们的值是一样的,但是他们所指向的内容的类型是不一样的,a的类型是int(*p)[3],而a[0]的类型是int p[3],所以a只能代表a[0]的地址而不是a[0][0]的地址。
说到这里就有一句重点的要提出来了:对于数组和指针的相互转换中,一定要抓住他们的类型比较,这样才能确保转换的正确性。下表列出数组和指针的等价关系:
一般我们认为任意维数的数组都可以看做是一个一维数组,实际上也是这样的,系统中并没有多维数组的概念,都是以一维数组来存储。
突然想起来,当初还有一个困惑我的问题:(????)书上写被赋值的指针变量前不能再加“* ”说明符,如int a;int *p;*p = &a;这是错误的表示方法,书上还写int a;int *p = &a;这是正确的,初看起来这好像很矛盾额,怎么也不理解。
其实是这样的:要弄清楚,首先要知道初始化和赋值的概念,比如int a = 5;这是初始化,而a = 5 这是赋值,还有一点,在指针中*p中的“*”代表解引用也就是“取内容”,因此*p所代表的是指针p所指向的内容。再回到问题,*p = &a 首先看看左右两边值得类型,左边是int型的值,右边是地址,类型根本不匹配,不能赋值;int *p = &a这是代表初始化,“*”的含义仅仅是代表变量是指针类型,而不是解引用,所以这样左右类型是匹配的可以赋值。
接下来是多级指针:
它是指一个指针的内容是另一个指针的地址,此指针就是多级指针。
int i = 100;int *pi = &i ;int **ppi = π
n级指针可以存放n-1级指针的地址:
int a;
Int *p = &a;
Int **pa = &p;
.....
.....
如此类推。
今天先复习到这里,明天继续......希望大家多多指点。
转载于:https://blog.51cto.com/doublewen/764847
C语言复习篇之数组与指针相关推荐
- c++如何打印一维数组首地址_C语言之二维数组和指针的结合
最近在练习 C 语言计算机二级的程序设计题,碰到了二维数组和指针的结合,当时怎么调试都不对,自己也记不清楚该怎么用了就跑去看书翻资料重新复习.自己纠结的问题是二维数组 int a[3][4]的数组名是 ...
- 【C语言】深入理解数组和指针——初识指针
哈喽大家好,我是保护小周ღ,C语言,接下来给大家带来的是深入理解数组和指针的初识指针,这篇主要讲的是基础指针的相关知识,是博主的所见所闻,细节上的知识后面会这里面没有提,会放在后期的文章中与数组相结合 ...
- c语言数组与指针的基础知识,C语言学习笔记之数组与指针的关系
首先,大家先需知道一个关于基类型的概念 基类型:组成一个新类型的基础类型 这句话是什么意思呢?举个例子: int a[3] = {1,2,3}; 上面是由三个int类型的数组成一个新的类型也就是数组, ...
- c语言指针变量的定义数组的长度,【C语言更新】指向数组的指针
文/Edward 前面我们在讲述数组的时候曾经说过,对于数组内部元素的引用方式主要有两种,一种就是使用方括号"[]"的下标索引,另一种就是之前提到过,但是没有细致讲述的指针引用. ...
- C语言反汇编 - 多维数组与指针
反汇编(Disassembly) 即把目标二进制机器码转为汇编代码的过程,该技术常用于软件破解.外挂技术.病毒分析.逆向工程.软件汉化等领域,学习和理解反汇编对软件调试.系统漏洞挖掘.内核原理及理解高 ...
- C语言高级编程:数组和指针作为函数形参
测试环境: win10 x86-64 gcc: x86_64-pc-cygwin 1. 说明 1)作为函数形参时(也只有这种情况),数组与指针等同,int *p = int a[],p和a在函数内部都 ...
- C语言之指向一维数组的指针
int array[5] = {1, 2, 3, 4, 5}; // 定义数组 int *intptr = array; // 定义指向数组元素的指针 int (*arrayptr)[5] = &am ...
- C语言入门篇(二)指针的介绍和运用
一.内存 1.内存的含义: 内存是沟通CPU和硬盘的桥梁: (1)暂存CPU中的运算数据 (2)暂存与外部存储器交换的数据 物理存储器:实际存在的具体存储器芯片 主板上装插的内存条 ...
- c语言memset清空指向数组的指针_C语言中数组和指针的关系
数组的数组名其实可以看作一个指针.看下例: 1. int array[10]={0,1,2,3,4,5,6,7,8,9},value; 2. value=array[0]; //也可写成: ...
最新文章
- [ZZ]STM32之RCC
- 0.2 控制系统的状态空间表示法
- SQL之用户自定义函数
- 数据结构与算法--经典10大排序算法(动图演示)【建议收藏】
- 伤疤好了有黑印怎么办_春藤家长圈|家有二孩,老大老二一起抢东西,家长该怎么办?...
- sql语句执行步骤详解
- Ubuntu环境下sublime3 nodejs安装与插件配置
- Bigendian 奇数内存地址取整形crash
- c语言中-(间接成员运算符)的含义
- 神经网络优化中的病态问题
- Camtasia 2021mac版
- English trip V2 - 9 People and Places Teacher:Julia Key: at on in
- 小程序源码:老人疯狂裂变引流视频推广
- 最全的Java笔试题库之选择题篇-总共234道【61~120】
- 脉冲宽度调制 matlab,关于PWM脉冲宽度调制的点滴总结
- 3D MAX脚本教程1
- PADS Layout中修改板框大小
- 大数据分析师面试求职攻略
- sqlserver drop image类型的列不释放空间问题处理
- 一个屌丝程序猿的人生(四十八)