讲讲数组的难点,看看里面有没有你的知识漏洞

发布于:2022-11-09 ⋅ 阅读:(11) ⋅ 点赞:(0) ⋅ 评论:(0)

目录

一.数组初阶

1,一维数组的创建中的问题

2.二维数组的初始化

 3.数组越界

4.数组传参

 二,数组进阶

1.指针数组的使用

 2.数组传参

 a.一维数组的传参

b.二维数组的传参

3.sizeof与数组结合应用

a.sizeof+整形

b.sizeof+字符

c.sizeof+字符串

d.sizeof+二维数组

 4.strlen与数组结合应用

a.strlen+字符

b.strlen+字符串 

总结


一.数组初阶

1,一维数组的创建中的问题

数组是一种数据格式,能够存储多个同类型的值。

要创建数组,可使用声明语句。应指出以下3点:

1.存储在每个元素中的值的类型;

2.数组名;

3.数组中的元素数。

数组的通用格式如下:

typeName  arrayName[arraySize];

arraySize指定元素数目,它必须是整形常数或const值,也可以是常量表达式(如8*sizeof(int)),必须是已知的,不然会报错,如下:

 注:数组创建,在C99标准之前, [] 中要给一个常量才可以,不能使用变量。在C99标准支持了变长数组的概念,数组的大小可以使用变量指定,但是数组不能初始化。

2.二维数组的初始化

初始化下面这三种都能使用,都为正确的

如果列省略,就会报错,如下:

 3.数组越界

数组下标是有范围限制的;规定是从0开始的,且最后一个元素为n-1;如果数组的下标小于0或大于n-1就越界了。

注意:尤其要注意数组下标小于0时,可能你写完找了好久都找不到错误,它发生错误时会显示下面这串英文:Run-Time Check Failure #2 - Stack around the variable ‘a’ was corrupted4

4.数组传参

 数组名表示首元素的地址,当你传参时传的就是首元素,如下面的冒泡函数

 

他上面没有显示任何问题,但编译就有问题,并没有实现排序,这就是数组传参的问题,通过调试我们可以发现他的bubble_sort函数内部sz=1,这就是他错误所在,想要修改就十分简单了,把sz也传参过去就行,如下代码: 

 二,数组进阶

1.指针数组的使用

指针数组是一个存放指针的数组,如下面代码分别表示整形指针的数组,一级字符指针的数组和二级字符指针的数组

那怎么打印指针数组里面的内容呢?这里就需要通过for循环来实现,如下 通过对数组的解引用来实现,即arr[i]+j表示第i行第列的元素,这里也可以把他看作二维数组,通过二维数组的方式来解决,如下

 2.数组传参

 a.一维数组的传参

先来看看下面这串代码

int arr[10]为一维数组,test[arr]传参时传的是首元素的地址,其传参过去参数可以写成数组,其参数可以是数组(如int arr[]]),可以 带元素个数(如int arr[10]),同时也可以通过指针来传参(如int* arr);

int* arr2[20]为指针数组,其传参时可以直接写成指针数组,同时也可以用二级指针表示。

b.二维数组的传参

如下面代码

其中有一些就是错误的传参。

void test(int arr[3][5])这肯定是正确的了,直接调用数组来做参数。

void test(int arr[][])这个调用数组的行和列都没表示,因为这是一个二维数组,可以不知道有多少行,但必须知道一行有多少个元素,函数的形参的设计只能省略第一个[]的元素,故错误

void test(int arr[][5])这如前面所说,只省略行,这也是的。

void test(int*arr) 因为这参数传的是二维数组,传的是首元素的地址,首元素表示第一行的地址,如果用指针接收,接收的也是第一行的地址,首元素就是一维数组的地址,整形指针不能接收一维数组的地址,故这是错误的。

void test(int* arr[5])这是指针数组,即数组的元素是指针,并不能接收数组,故错误

void test(int (*arr)[5])这是数组指针,即指向数组的指针,正好能接收数组,故对的

void test(int **arr)因为这是二级指针,是用来接收一级指针变量的地址的,故也不行

3.sizeof与数组结合应用

a.sizeof+整形

 此为int类型的一维数组,通过sizeof与数组结和来判断其大小,图中注释已经非常清楚了,只要是地址就是4//8个字节,这里就不详细讲了,图上简明易懂的已经讲解了。

b.sizeof+字符

 此为char类型的数组,就说一下arr[1]吧,为第二个元素,即为‘b’,应为char类型为1个字节故为1.

c.sizeof+字符串

这每个都注释了,就不解释了。

d.sizeof+二维数组

就有一个int a[3][4]={0};的二维数组,然后看下面代码结果。

 sizeof(a)表示整个二维数组的大小,为4*12=48个字节。

sizeof(a[0][0])表示第一行第一列的元素,因为int类型为4个字节,故为4.

sizeof(a[3])虽然越界了,但还是表示一行的大小,仍为16个字节。

其他的都详细注释了,就不多说了。

 4.strlen与数组结合应用

a.strlen+字符

因为是字符数组,后面接的是字符,字符后面没有/0,又因为strlen要读到/0才会停,所以读完最后一个字符‘f’并不会停,还会继续编译,故是随机值。 

要注意*arr和arr[]会出错,因为其传递的是ASCII值,无\0;

我通过画图的方式来演示一下后面三个的答案原因

这就十分简明易懂了,为什么是随机值减6,随机值-1。

b.strlen+字符串 

 strlen(arr)和strlen(arr+0)都是表示从a开始一直到\0;故其字符串大小为6个字节。

&arr+1就是跳过了这个数组,进入下个数组的地址,故是随机值。

&arr[0]+1指向b的地址,到\0有5个字符,故为5.

总结

     到这里本篇文章就结束了,希望各位读者能点赞,关注加评论,文章有什么不对的地方可以在评论区指出,作者码字不易,希望各位读者多多支持,感谢各位阅读。