`
fantaxy025025
  • 浏览: 1311258 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

C语言数组与指针学习总结【摘,有改动】

 
阅读更多

=

=

=

https://blog.csdn.net/grey_csdn/article/details/56971681 

C语言数组与指针学习总结【摘,有改动】

 

 

工作之后最害怕的是对最基础知识的考查,因此还是有必要随时回炉学习,温故知新。今天再次回顾总结一下C语言数组相关知识。主要是学习《C语言陷阱与缺陷》的学习笔记。

       C语言数组值得注意的有两点:

       1,C语言中只有一维数组,而且数组的大小必须在编译时期就确定下来(旧标准)。然而,C语言数组的元素可以是任意对象,包括数组。这样就给多维数组的实现或者仿真提供了可能。

       2,对于数组,我们只能够做两件事(不同于指针)一是获取数组的大小,二是获得指向数组下标为0的元素的指针其他的任何操作虽说看起来像是数组,但是本质上其实都是基于指针的操作

       以上两天总结摘取自《C语言陷阱与缺陷》,让我想起了之前自己看过的国外的一份C语言数据结构与算法的讲义。其中关于C语言数组与指针的知识给了一个重点关注点的概括——除了作为sizeof的参数以外,其它时候C语言数组的名称跟指向数组首元素的指针是等价的。

       关于C语言中数组的运算机制如何实现是关系到对数组理解的一个重点。其实,这就是要学会(或者说是记住)C语言数组声明定义的形式以及含义。

       1,int a[3];

              定义了一个元素个数为3个的数组a,其中每个元素都是int类型。

       2, struct

{

       int p[4];

       double x;

}b[17];

定义了一个元素个数为17个的数组b,其中每个元素都是一个结构体。

       3,int a[12][31];

              声明定义了一个数组a,该数组有12个元素,其中每个元素是一个拥有31个元素的数组,每个最小子元素的类型都是int。这个地方理解时候一定不能够按照前面两个例子的顺序,从左到右一个个数字字符进行解析。需要记住的还是最前面的那一点,C语言中只有一维数组,而数组名称后面跟着的第一个数字维度就是数组的真实维度。除此之外,其他的参数则是数组元素的信息描述。

       数组名称与指向数组的指针的等价之处在两种表示的等价,如果定义了一个数组a,那么数组的下表为i的元素可以表述为:

       *(a + i) 或者a[i]

       实际上,后者只是前者的一种常用的简写方式。

       而由于上面这种描述,其实a[i]和i[a]表示的含义一样(不能这样的,这是面向编译器编程的了!!!但是知晓原理确实不错的。)。编写如下测试代码;

#include"stdio.h"

 int a[5] ={1,2,3,4,5,};

 int main(void)

{

       printf("%d\n",a[3]);

       printf("%d\n",3[a]);

       return 0;

}

       其中,数组定义的时候我故意在最后的元素后面加上了一个逗号(这是可以的)。其实,这并不是错误。本来我也不是很理解这种方式,在对了《UNIX编程艺术》一书之后才明白。其实,这算是C语言设计的一个优秀的特点,这种特征不仅方便数组元素的扩充时候的修改,而且方便数组的工具生成。程序的编译以及运行记录如下;

 

4

       由上面的验证可以得出先前陈述的结论或者推论。

       接下来通过简单的代码,回顾二维数组与指针的关系基础知识。编写代码如下:

E:\WorkSpace\01_编程语言\01_C语言\01_C语言陷阱与缺陷\exp02>gccexp02.c

#include"stdio.h"

 

int a[12][31];

int *p;

int i;

 

int main(void)

{

       p = a[4];

       printf("value of p: %p\n",p);

       printf("size of a[4]:%d\n",sizeof(a[4]));

       a[4][7] = 3;

       i = a[4][7];

       printf("value of i: %d\n",i);

       i = *(a[4] + 7);

       printf("value of i: %d\n",i);

       i = *(*(a + 4) + 7);

       printf("value of i: %d\n",i);

       return 0;

}

       编译后,运行结果如下:

E:\WorkSpace\01_编程语言\01_C语言\01_C语言陷阱与缺陷\exp02>a

value of p:00405630

size of a[4]: 124

value of i: 3

value of i: 3

value of i: 3

       其中,a[4]的含义自然是代表数组a的下标为4的元素,而元素的为31个int类型对象。通过计算其占用的空间可以看出这一点。而进一步来看,其实a[4]应该是一个31个元素的数组的数组名。这样,a[4]也就等同于这个数组的首地址。在程序中,我通过指针赋值的方式输出了这个地址数值。接下来的元素取值就值得去品味一下了:

       第一次i取值:使用了数组名后面加中括号指明偏移来实现;

       第二次i取值:进一步把第一步中的方式改成了指针取值的方式,通过首地址加偏移的方式。

       第三次i取值:把迭代着的一个数组进一步展开。从最终的形式上看,这种方式比使用下标取值的简写方式要难理解不少。

       最终i的三次输出都是相同的,其实这也算是对三种方式等价的一个最基本的验证。而把a赋值给p是错误的,因为a的含义是一个指向“二维数组的指针”。在代码中加入相应的代码测试的时候,gcc编译器会给出警告。不过,程序还是能够编译通过并运行。

 

 

=

=

=

 

分享到:
评论

相关推荐

    单片机的C语言中数组的用法

    "单片机C语言数组的用法" 数组是由具有相同类型的数据元素组成的有序集合。数组是由数组名来表示的,数组中的数据由特定的下标来唯一确定。引入数组的目的,是使用一块连续的内存空间存储多个类型相同的数据,以...

    C语言实例解析精粹源码.rar

    《C语言实例解析精粹源码》这个压缩包文件是一个丰富的学习资源,主要针对C语言编程的学习者。C语言作为基础且强大的编程语言,被广泛应用于系统开发、嵌入式系统以及各种软件工程中。这份资源包含了一系列的C语言...

    华为嵌入式面试题

    华为嵌入式面试题知识点总结 ...华为嵌入式面试题涵盖了 C 语言的多个方面,包括预编译、指针、数组、sizeof 运算符、指针的位数、数组指针运算、strcpy 函数的使用等知识点。对这些知识点的理解和掌握是非常重要的。

    c语言课程设计_超市数据汇总系统.rar_c语言课程设计_课程设计

    5. **数组与指针**:数组可以用来存储多条商品信息,而指针可以用于高效地传递和操作数据,尤其是在函数间传递大型数据结构时。 6. **输入/输出处理**:用户交互界面需要处理标准输入输出,如使用scanf()和printf()...

    C语言标准文档

    这份"C语言标准文档"是对C99标准的详细解读,对于学习和理解C语言具有极高的价值。 C99标准引入了许多新特性,旨在提高代码的可读性、效率和可靠性。其中一些关键的改动包括: 1. **复杂初始化器**:C99允许在声明...

    C语言复习题64-按类型(自己修正)程序设计.doc

    理解指针的概念和指针与数组的关系对于C语言编程至关重要。 10. **结构体和联合体**:结构体是将多个不同类型的变量组合在一起的复合类型,而联合体则允许一个变量在不同时间存储不同类型的值。 11. **算法**: -...

    华为嵌入式面试题1.pdf

    本资源摘要信息涵盖了五个与嵌入式系统相关的面试题,涵盖了预编译、指针、数组、sizeof运算符和指针运算等基本概念。 1. 预编译: 预编译是指在编译前的准备工作,目的是减少编译时间和提高编译效率。在某些情况...

    基于C语言下的计算机软件编程的技术思考.pdf

    "基于C语言下的计算机软件编程的技术思考" ...C语言的指针可以是变量的地址,也可以是数组、数组元素、函数的地址,在调用的过程中需要考虑较多较复杂的情况,因此编程者需要仔细思考指针的使用。

    C语言大作业要求.pdf

    结合以上信息,我们可以了解到C语言大作业可能要求学生们利用C语言的基本特性,如结构体、宏定义、函数、数组、指针、字符串处理、条件控制和循环控制等,实现一个包含数据输入、数据处理和数据输出的完整程序。...

    ARM的ADS, C语言程序数个

    6. **数组与指针(Arrays and Pointers)**:用于处理批量数据和间接访问内存。 在ADS中,开发者可以创建C语言项目,导入这些程序,通过IDE进行编译、链接和调试。编译器会将C源代码转换成机器码,然后链接器将生成...

    C程序设计语言(第2版) K&R

    本书分为八章和四个附录,内容涵盖了C语言的各个重要方面,如基本概念、数据类型、运算符、控制流程、函数、数组和指针等,以及C语言的程序设计方法。书中内容讲解深入浅出,配合大量实例,非常适合大学院校的学生...

    全国计算机等级考试C语言上机考试分析.pdf

    1. 理解并掌握C语言的基础知识,包括数据类型、变量、数组、指针、函数等; 2. 熟悉C语言的控制结构,包括选择结构(if语句、switch语句)和循环结构(while语句、do-while语句、for语句); 3. 掌握C语言的函数设计...

    C语言入门经典(第4版)--源代码及课后练习答案

    本书集综合性、实用性为一体,是学习C语言的优秀入门教材,在世界范围内广受欢迎,口碑极佳。书中除了讲解C程序设计语言,还广泛介绍了作为一名C程序设计人员应该掌握的必要知识,并提供了大量的实用性很强的编程...

    华为笔试题

    【华为笔试题】主要涉及了C语言的基础知识,包括数组、指针、运算符优先级、预编译、常量指针以及字符串处理等方面。以下是这些知识点的详细说明: 1. **数组与指针**: - 在C语言中,数组名在大多数情况下会被...

    单片机C语言教学探索.pdf

    综上所述,单片机C语言的教学探索表明,要使学生能够更好地学习并掌握这门课程,需要有合适的时间安排、精心挑选的教学内容和有效的教学方法。这要求教育者不仅要精通单片机和C语言的专业知识,还需要具备引导学生、...

    华为嵌入式面试题.pdf

    在C语言中,sizeof运算符可以用于数组、指针、结构体等多种数据类型。 在华为嵌入式系统面试题中,问题4问的是以下代码中的两个sizeof用法有问题吗?答案是函数内的sizeof有问题。根据语法,sizeof只能测出静态数组...

    北京航空航天大学991数据结构与C语言程序设计2021年考研专业课初试大纲.pdf

    - **指针与数组**:通过指针访问数组元素的方法。 综上所述,北京航空航天大学2021年考研初试大纲中的数据结构与C语言程序设计部分涵盖了计算机科学中的核心概念和技术,这些内容不仅是考研复习的重点,也是计算机...

    国家计算机二级c语言历年上机真题及基础知识一.pdf

    【国家计算机二级C语言考试知识点】 ...这些知识点是C语言学习的基础,理解和掌握它们对于通过国家计算机二级C语言考试至关重要。在实际编程中,还需要结合良好的编程习惯和调试技巧,才能写出高质量的代码。

    20170810_c语言研究十三_李智宇 1

    总结,本篇报告揭示了C语言中通过分离共性和个性、利用函数指针和数据结构实现模块化设计的方法,这对于理解和编写大型、复杂程序至关重要。通过这种方式,代码的维护和更新变得更加高效,同时提高了代码的可读性和...

Global site tag (gtag.js) - Google Analytics