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语言复习篇之数组与指针相关推荐

  1. c++如何打印一维数组首地址_C语言之二维数组和指针的结合

    最近在练习 C 语言计算机二级的程序设计题,碰到了二维数组和指针的结合,当时怎么调试都不对,自己也记不清楚该怎么用了就跑去看书翻资料重新复习.自己纠结的问题是二维数组 int a[3][4]的数组名是 ...

  2. 【C语言】深入理解数组和指针——初识指针

    哈喽大家好,我是保护小周ღ,C语言,接下来给大家带来的是深入理解数组和指针的初识指针,这篇主要讲的是基础指针的相关知识,是博主的所见所闻,细节上的知识后面会这里面没有提,会放在后期的文章中与数组相结合 ...

  3. c语言数组与指针的基础知识,C语言学习笔记之数组与指针的关系

    首先,大家先需知道一个关于基类型的概念 基类型:组成一个新类型的基础类型 这句话是什么意思呢?举个例子: int a[3] = {1,2,3}; 上面是由三个int类型的数组成一个新的类型也就是数组, ...

  4. c语言指针变量的定义数组的长度,【C语言更新】指向数组的指针

    文/Edward 前面我们在讲述数组的时候曾经说过,对于数组内部元素的引用方式主要有两种,一种就是使用方括号"[]"的下标索引,另一种就是之前提到过,但是没有细致讲述的指针引用. ...

  5. C语言反汇编 - 多维数组与指针

    反汇编(Disassembly) 即把目标二进制机器码转为汇编代码的过程,该技术常用于软件破解.外挂技术.病毒分析.逆向工程.软件汉化等领域,学习和理解反汇编对软件调试.系统漏洞挖掘.内核原理及理解高 ...

  6. C语言高级编程:数组和指针作为函数形参

    测试环境: win10 x86-64 gcc: x86_64-pc-cygwin 1. 说明 1)作为函数形参时(也只有这种情况),数组与指针等同,int *p = int a[],p和a在函数内部都 ...

  7. C语言之指向一维数组的指针

    int array[5] = {1, 2, 3, 4, 5}; // 定义数组 int *intptr = array; // 定义指向数组元素的指针 int (*arrayptr)[5] = &am ...

  8. C语言入门篇(二)指针的介绍和运用

    一.内存 1.内存的含义: 内存是沟通CPU和硬盘的桥梁: (1)暂存CPU中的运算数据 (2)暂存与外部存储器交换的数据 物理存储器:实际存在的具体存储器芯片      主板上装插的内存条      ...

  9. c语言memset清空指向数组的指针_C语言中数组和指针的关系

    数组的数组名其实可以看作一个指针.看下例: 1.    int array[10]={0,1,2,3,4,5,6,7,8,9},value; 2.    value=array[0]; //也可写成: ...

最新文章

  1. [ZZ]STM32之RCC
  2. 0.2 控制系统的状态空间表示法
  3. SQL之用户自定义函数
  4. 数据结构与算法--经典10大排序算法(动图演示)【建议收藏】
  5. 伤疤好了有黑印怎么办_春藤家长圈|家有二孩,老大老二一起抢东西,家长该怎么办?...
  6. sql语句执行步骤详解
  7. Ubuntu环境下sublime3 nodejs安装与插件配置
  8. Bigendian 奇数内存地址取整形crash
  9. c语言中-(间接成员运算符)的含义
  10. 神经网络优化中的病态问题
  11. Camtasia 2021mac版
  12. English trip V2 - 9 People and Places Teacher:Julia Key: at on in
  13. 小程序源码:老人疯狂裂变引流视频推广
  14. 最全的Java笔试题库之选择题篇-总共234道【61~120】
  15. 脉冲宽度调制 matlab,关于PWM脉冲宽度调制的点滴总结
  16. 3D MAX脚本教程1
  17. PADS Layout中修改板框大小
  18. 大数据分析师面试求职攻略
  19. sqlserver drop image类型的列不释放空间问题处理
  20. 一个屌丝程序猿的人生(四十八)

热门文章

  1. 家长会:我的发言稿,女儿的信
  2. 英雄会解读:不一样的回答,一样的CTO
  3. 人生致命的8个经典问题
  4. Application Architecture - Table Data Gateway
  5. XDP/eBPF — 基于 eBPF 的 Linux Kernel 可观测性
  6. 记录Flex布局的属性
  7. 【TensorFlow系列】【五】利用inception v3 pb模型文件做预测
  8. 第 15 章 Framework Design
  9. 英国EE:启动TechCity 2.0 首期将部署LTE-Advanced Pro
  10. 在化学教学中怎么用ChemOffice