文章目录

  • 1、一维数组
  • 2、一维数组和指针的区别
  • 3、sizeof的使用
  • 4、二维数组
  • 5、用一级指针访问二维数组元素
  • 6、字符数组和字符串数组
  • 7、strlen函数与sizeof运算符号的差别
  • 8、指针数组

1、一维数组

注意:和普通变量一样,定义的未初始化全局数组和静态局部数组存放在BSS段,定义的已初始化全局数据和静态局部数组存放在静态数据区。而函数内定义的局部数组(不包括静态数组)存放在栈空间中。
“长度表达式”可以包含常量,但不能包含变量。也就是说,C语言不允许对数组的大小做动态定义,即数组的大小不依赖于程序运行过程中变量的值。
由于const定义的常量具有变量的性质,这类常量也不能作为定义数组的“长度表达式”,例如“const int NUM=10;int a[NUM];”在C语言中编译错误,在C++中编译正确。

注意,在定义数组时“长度表达式”可以包含常量,但是不能包含变量。
对于局部数组,若没有进行初始化,其所有元素值为垃圾值,若初始化时仅对部分元素赋了初值,其余元素取默认值(数值型为0,字符型为空字符);
除了初始化,数组名不能作为左值,因为,它是一个表示首元素地址的常量例如定义 int a[3]后执行a={1,2,3}是错误的

2、一维数组和指针的区别

在C语言中,规定数组名代表数组的首元素的地址,也就是说,数组名就具有地址的概念,而且是一个地址常量,因此可以将数组名(即在内存中存放该数组的首地址)赋给指针。

特别注意:数组名a代表的是该数组首元素的地址,而不是数组a的首地址,a与&a[0]的含义相同,如“a=&a[0]”返回真,是正确的比较。

&a表示整个数组的首地址,但是在执行语句printf("%x,%x\n",a,&a);时输出的a和&a是相同的,那么两者有什么区别呢?其中区别主要是步长的不同,a+i=a+isizeof(int),其步长为sizeof(int),即一个数组元素的长度,而&a+i=&a+i(a数组的大小),其中步长为a数组的大小。尽管a和&a的值相同,但表示不同的含义,"&a==a"是错误的比较。
为了清楚地说明&a和a的差别,这里采用地址分级的概念,数组元素的地址称为一级地址(其值可以赋给一级指针),而一级地址的地址称为二级地址,以此类推,不同级别的地址是不能比较的,因为对应的步长不同。一维数组名a是一级地址,而&a中加了一个取地址运算符升级为二级地址。

对于一维数组元素,char s[]=“abc”;
定义的是一个字符数组,所以相当于定义了一些空间来存放“abc”,如果数组s是已初始化的全局数组或者静态局部则存放在静态数据区,如果它是在函数内部定义的局部数组则存放在栈空间中。
对于*p="abc"中的abc是常量,存储在静态局部数据区域。

另外还要特别强调的是*(a+i)a[i] *(p+i) 和p[i]是等价的

p++=1的功能是将p所指的元素修改为1,然后让p指向下一个元素;
++p=1的功能是先执行++p再执行p,先让p指向下一个元素,并将这个元素的值修改为1.
(p)++的功能是先指向p。然后再将
p的值加1;

3、sizeof的使用

指针变量的sizeof:指针变量的sizeof等于计算机内部地址总线的宽度,所以在32位计算机中一个指针变量的返回值必定是4(注意结果是以字节为单位)
数组的sizeof,对数组做sizeof运算等效于对其元素类型做sizeof的结果乘以数组元素的个数,即sizeof返回整个数组在内存中占用的内存字节数。

char a[]="abc";
int b[3];
sizeof(a);  //结果为4,字符末尾还存在一个'\0'结尾符
sizeof(b);//结果为3×4=12(依赖于int的长度)

sizeof的副作用:
sizeof是运算符,跟加减乘除的性质是其实是一样的,在编译的时候就开始执行了,而不是在程序执行时才执行。
sizeof(i++);
其中i++并不执行,因此i++的作用被消除了。

4、二维数组

二维数组元素的引用方式如下:
数组名[下标表达式1][下标表达式2]
其中,下标表达式可以是整型常量或整型表达式。注意不能为变量或者const
对于给了数组部分元素赋初值的,其余自动赋值为0;

int a[3][4]={{1,2,3,4},{5,6,7,8}};注意允许行,但是不能允许省略列,二维数组在初始化时候必须指定列长度。

由于二维数组a[3][4]也就相当于a={a[0][4],a[1][4],a[2][4]},每个一维数组元素又包含有4个元素。这种降维的思路可以扩展到3维和四维以上的数组。a数组有三行,将它们看成3个一维数组元素,即a={a[0],a[1],a[2]},每个一维数组元素又含有4个元素。这种降维的思路可以扩展到3维或4维以上。
数组名a代表的是该二维数组首元素a[0]的首地址,即a与&a[0]的含义相同.也就是说a与&a[0]的含义相同,“a=&a[0]”返回真,是正确的比较。其中a[0]又和&a[0][0]的含义相同,所以a==&&a[0][0].

二维数组名是一个二级地址(例如**a的结果为a[0][0]),三维数组名是一个三级地址。
&a是整个二维数组的首地址,为三级地址,所以“a==&a”的比较是错误的。
其实,我们只要记住数组名a代表的是首元素的地址,二维数组降解为一维数组来看。

此外变址运算符号“【】”相当于*(+)
所以a[i][j],*(a[i]+j), *(*(a+i)+j)三者相同都表示第i行j列元素

5、用一级指针访问二维数组元素

可以把二维数组看成是以一维数组作为元素的二维数组

#include <stdio.h>
#include <malloc.h>
void main()
{int i;int a[3][2]={{0,1},{2,3},{4,5}};int *p=a[1];for (i=0;i<2;i++)printf("%d",*p++);
}

输出2 3

若有定义int a[3][4] ,不能表示a[1][1]的是()
A、*(&a[0][0]+5)
B、*(*(a+1)+1)
C、*(&a[1]+1)
D、*(a[1]+1)

正确答案C
C选项表示的是a[2][2]

6、字符数组和字符串数组

字符数组的定义
由于C语言中没有直接提供字符串类型,字符串被定义为一个字符数组。例如:

char str[10];

一个字符数组的字符构成一个字符串,这个字符串结束标志是ASCII码为0的字符,即空字符,表示成‘\0’。例如上面定义的str字符数组最多可以存储9个字符,还剩一个字符位置用来存放结尾符。
字符数组初始化的两种方式:

char s[5]={'A','B','C','D','\0'}
char s[5]={"ABCD"}

注意:
与普通数组一样,字符数组名是地址常量,其值为数组本身在内存中存放区域的首地址,即字符串中第一个字符的存储地址,所以赋值语句s="ABCD"是错误的。
初始化少于定义的数组元素的个数,这时候被赋予空格符 (空格符不同于空字符,空字符的ASCII 码为0,空格符的ASCII码为32)。

C语言中常用的字符串处理函数:
字符串数组
字符串数组的定义:它的每个元素都是一个字符串。字符串数组是二维数组。
S【0】表示数组中第一个字符串首元素的地址,为一维地址。
注意S【0】=“ABCD”这种赋值是错误的,因为S【0】是一个地址常量,不允许对它赋值;
而S[0][0]="ABCD"也是错误的,因为S【0】【0】是字符,不是字符串。
使用scanf或者gets函数赋值
使用scanf或者gets函数只能给一个字符串赋值,即每次只能给字符串数组中的一个一维地址的元素赋值。

scanf("%s",name[0]);       //输入的字符串不能含有空格
gets(name[0]);                  //输入的字符串可以含有空格

使用标准字符串函数赋值:
使用标准字符串函数strcpy等实现字符串的复制等,例如:

strcpy(name[0],"Smith");

7、strlen函数与sizeof运算符号的差别

strlen函数用于求一个字符串的实际长度,从开始字符到遇见第一个’\0’,如果只定义没有给它赋予初值,这结果是不定的,它会从首地址一直找下去,知道遇到‘\0’停止。sizeof返回的是变量定义后所占内存的字节数,不是实际长度。
例如, char a[5],strlen(a)的结果是不定的,因为数组a没有赋初值,而sizeof(a)的结果为5
strlen的结果是要在执行时才能计算出来,是用来计算字符串的长度,不是类型占内存的大小;而sizeof不能返回动态分配的空间大小。

8、指针数组

当多个基类型相同的指针变量集合成数组时,就形成了指针数组。指针数组时指针的集合,它的每个元素都是一个指针变量。

5、C语言面试笔试--数据组织--数组相关推荐

  1. 1、C语言面试笔试---变量定义和声明

    文章目录 1.背景 2.变量定义和声明 1.局部变量和全局变量 2.变量的存储类别 3.例题 4.内存泄漏 1.背景 2019秋招马上开始了,今天已经是7月30号了,赶紧刷刷C语言,争取在8月中旬刷完 ...

  2. 2、C语言面试笔试---运算符和表达式

    文章目录 背景 1.运算符和表达式 1.1自增自减运算符++与-- 1.2 C语言符号的优先级 1.3 类型转换 1.4 顺序点的概念 1.5 贪心法 2.面试笔试例题 背景 1.运算符和表达式 1. ...

  3. 4、C语言面试笔试--内存操作-指针

    文章目录 1.指针变量 1.1 基本概念 1.2 指针运算 1.3 面试题 2. 常量和常量指针 2.1 字面常量和符号常量 2.2 const指针常量 2.2.1 常量指针 2.2.2 常量指针变量 ...

  4. 3、C语言面试笔试--控制结构

    文章目录 背景 1.选择控制结构 2.面试例题 3.循环控制语句 4.面试题 背景 现在进入C语言的控制结构,这篇完成后,C语言的基础操作也就算完结了.控制语句主要分为选择控制语句和循环控制语句. 1 ...

  5. c语言关于内存笔试,4、C语言面试笔试--内存操作-指针

    文章目录1.指针变量1.1 基本概念1.2 指针运算1.3 面试题2. 常量和常量指针2.1 字面常量和符号常量2.2 const指针常量2.2.1 常量指针2.2.2 常量指针变量2.2.3 指针常 ...

  6. 单片机c语言面试笔试,c语言面试题集(单片机)..doc

    c语言面试题集(单片机). c语言面试题集(单片机) 1.预处理器(Preprocessor)1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define S ...

  7. C语言面试干货——指定结构体初始化器(GCC手册解析)

    文章目录 指定结构体初始化器(Designated Initializers) 背景 初始化struct 初始化union 对于重复初始化的说名 本人就职于国际知名终端厂商,负责modem芯片研发. ...

  8. 直击招聘程序员面试笔试C语言深度解析,直击招聘 程序员面试笔试C++语言深度解析(直击招聘) pdf epub mobi txt 下载...

    直击招聘 程序员面试笔试C++语言深度解析(直击招聘) pdf epub mobi txt 下载 图书介绍 ☆☆☆☆☆ 李春葆,李筱驰 著 下载链接在页面底部 发表于2021-05-18 类似图书 点 ...

  9. 中软国际python机试题_【中软国际c语言开发笔试试题及答案】 - 面试网

    中软国际c语言开发笔试试题及答案: 一 选择 1.在一个C程序中( ) [A] main函数必须出现在所有函数之前 [B] main函数可以在任何地方出现 [C] main函数必须出现在所有函数之后 ...

最新文章

  1. iOS开发小技巧--边接受数据边写入文件的两种方法
  2. python绘制直方图根据不同分类_如何在python中绘制具有多个类别的直方图
  3. (转)双系统卸载Ubuntu
  4. oracle禁止修改密码,Oracle 用户密码过期后不允许修改密码的示例代码
  5. [转载] java 计算协方差_Java的深度:通过协方差暴露的API泄漏
  6. Docker小结(五)
  7. jQuery操作select控件取值和设值
  8. 风控体系建设、数字化转型、金融科技应用前,您是如何看待数据问题的?
  9. Tableau 2018.3破解教程(截止2019-08-18)试用过期也可用
  10. 一次nginx 502 mysql not contect 排错经历
  11. 3.5亿!创维电视董事长双11直播带货,哪些细节值得借鉴?
  12. Java学完后就业方向有哪些呢?
  13. 最优布线问题(三种方法)
  14. 【AIGC使用教程】Microsoft Edge/Bing Chat 注册使用完全指南
  15. 电脑手柄,Windows7电脑游戏手柄怎么设置?
  16. 初级前端工程师课程导航-姜威-专题视频课程
  17. Sdwan关于工业控制组网
  18. 洛谷P3758/BZOJ4887 [TJOI2017] 可乐 [矩阵快速幂]
  19. ERP实施顾问岗位职责
  20. 入侵检测---IDS

热门文章

  1. 03凑算式(数字填空)
  2. bzoj 1001: [BeiJing2006]狼抓兔子
  3. 【ObjectC—浅copy和深copy】
  4. sqlite第三方类库FMDB的使用
  5. hadoop data join
  6. Android超简单的进度条源码
  7. 意识到自己的无知这就是进步
  8. IT项目之旅(一)《宿舍管理系统》设计与实现
  9. [zhuan]二叉树遍历算法实现(C#2.0)
  10. cloud foundry部署报错TypeError: can't convert Hash into String