=
=
=
https://blog.csdn.net/grey_csdn/article/details/56971681
工作之后最害怕的是对最基础知识的考查,因此还是有必要随时回炉学习,温故知新。今天再次回顾总结一下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语言编程的学习者。C语言作为基础且强大的编程语言,被广泛应用于系统开发、嵌入式系统以及各种软件工程中。这份资源包含了一系列的C语言...
华为嵌入式面试题知识点总结 ...华为嵌入式面试题涵盖了 C 语言的多个方面,包括预编译、指针、数组、sizeof 运算符、指针的位数、数组指针运算、strcpy 函数的使用等知识点。对这些知识点的理解和掌握是非常重要的。
5. **数组与指针**:数组可以用来存储多条商品信息,而指针可以用于高效地传递和操作数据,尤其是在函数间传递大型数据结构时。 6. **输入/输出处理**:用户交互界面需要处理标准输入输出,如使用scanf()和printf()...
这份"C语言标准文档"是对C99标准的详细解读,对于学习和理解C语言具有极高的价值。 C99标准引入了许多新特性,旨在提高代码的可读性、效率和可靠性。其中一些关键的改动包括: 1. **复杂初始化器**:C99允许在声明...
理解指针的概念和指针与数组的关系对于C语言编程至关重要。 10. **结构体和联合体**:结构体是将多个不同类型的变量组合在一起的复合类型,而联合体则允许一个变量在不同时间存储不同类型的值。 11. **算法**: -...
本资源摘要信息涵盖了五个与嵌入式系统相关的面试题,涵盖了预编译、指针、数组、sizeof运算符和指针运算等基本概念。 1. 预编译: 预编译是指在编译前的准备工作,目的是减少编译时间和提高编译效率。在某些情况...
"基于C语言下的计算机软件编程的技术思考" ...C语言的指针可以是变量的地址,也可以是数组、数组元素、函数的地址,在调用的过程中需要考虑较多较复杂的情况,因此编程者需要仔细思考指针的使用。
结合以上信息,我们可以了解到C语言大作业可能要求学生们利用C语言的基本特性,如结构体、宏定义、函数、数组、指针、字符串处理、条件控制和循环控制等,实现一个包含数据输入、数据处理和数据输出的完整程序。...
6. **数组与指针(Arrays and Pointers)**:用于处理批量数据和间接访问内存。 在ADS中,开发者可以创建C语言项目,导入这些程序,通过IDE进行编译、链接和调试。编译器会将C源代码转换成机器码,然后链接器将生成...
本书分为八章和四个附录,内容涵盖了C语言的各个重要方面,如基本概念、数据类型、运算符、控制流程、函数、数组和指针等,以及C语言的程序设计方法。书中内容讲解深入浅出,配合大量实例,非常适合大学院校的学生...
1. 理解并掌握C语言的基础知识,包括数据类型、变量、数组、指针、函数等; 2. 熟悉C语言的控制结构,包括选择结构(if语句、switch语句)和循环结构(while语句、do-while语句、for语句); 3. 掌握C语言的函数设计...
本书集综合性、实用性为一体,是学习C语言的优秀入门教材,在世界范围内广受欢迎,口碑极佳。书中除了讲解C程序设计语言,还广泛介绍了作为一名C程序设计人员应该掌握的必要知识,并提供了大量的实用性很强的编程...
【华为笔试题】主要涉及了C语言的基础知识,包括数组、指针、运算符优先级、预编译、常量指针以及字符串处理等方面。以下是这些知识点的详细说明: 1. **数组与指针**: - 在C语言中,数组名在大多数情况下会被...
综上所述,单片机C语言的教学探索表明,要使学生能够更好地学习并掌握这门课程,需要有合适的时间安排、精心挑选的教学内容和有效的教学方法。这要求教育者不仅要精通单片机和C语言的专业知识,还需要具备引导学生、...
在C语言中,sizeof运算符可以用于数组、指针、结构体等多种数据类型。 在华为嵌入式系统面试题中,问题4问的是以下代码中的两个sizeof用法有问题吗?答案是函数内的sizeof有问题。根据语法,sizeof只能测出静态数组...
- **指针与数组**:通过指针访问数组元素的方法。 综上所述,北京航空航天大学2021年考研初试大纲中的数据结构与C语言程序设计部分涵盖了计算机科学中的核心概念和技术,这些内容不仅是考研复习的重点,也是计算机...
【国家计算机二级C语言考试知识点】 ...这些知识点是C语言学习的基础,理解和掌握它们对于通过国家计算机二级C语言考试至关重要。在实际编程中,还需要结合良好的编程习惯和调试技巧,才能写出高质量的代码。
总结,本篇报告揭示了C语言中通过分离共性和个性、利用函数指针和数据结构实现模块化设计的方法,这对于理解和编写大型、复杂程序至关重要。通过这种方式,代码的维护和更新变得更加高效,同时提高了代码的可读性和...