• 创建数组时,数组的长度必须用常量表达式进行定义,较好的方法是用宏来定义数组。
1
2
#define N 10;
int arr[N];

但在C99中的变长数组,也可以使用非常量表达式。


  • 关于字符数组的初始化,使用方法2初始化数组会在末尾自动创建\0。
1
2
char ch1[] = { 'p','a','n','g','h','u' };
char ch2[] = "panghu";

image-20211019213809977

这就会导致打印结果、字符串长度的不同。

strlen() 函数从字符串的开头位置依次向后计数,直到遇见\0,然后返回计时器的值。最终统计的字符串长度不包括\0

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include<string.h>
int main()
{
char ch1[] = { 'p','a','n','g','h','u' };
char ch2[] = "panghu";
printf("%s,%d\n", ch1, strlen(ch1));
printf("%s,%d\n", ch2,strlen(ch2));
return 0;
}

image-20211019215310977

因为数组ch1没有添加终止符\0,打印内容出现了意外,字符串长度也是一个随机数。


  • 由数组中各元素的地址可知,一维数组在内存中是连续存放的,随着数组下标的增长,地址由低到高变化。(二维数组也是如此)
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main()
{
int arr[10] = { 0 };
int i = 0;
for (i = 0; i < 10; i++) {
printf("&arr[%d]=%p\n", i,&arr[i]);
}
return 0;
}

image-20211019221954024

所以当我们知道数组中首元素的地址,便可以打印出所有元素。

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
int main()
{
int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
int *p = arr;
int i = 0;
for (i = 0; i < 10; i++) {
printf("arr[%d]=%d\n",i, *p);
p++;
}
return 0;
}

image-20211019222801287


  • 关于arr和&arr:
1
2
3
4
5
int arr[] = { 0,1,2,3,4 };
printf("%p\n", arr); //首元素地址
printf("%p\n", &arr[0]);
printf("%d\n", sizeof(arr)); //整个数组的大小
printf("%p\n", &arr); //整个数组的地址

数组名是首元素的地址。

sizeof(数组名)表示的是整个数组的大小,单位是字节。

&数组名表示的是整个数组,取出的是整个数组的地址。

首元素地址和数组地址的值是一样的,但意义不同,可以试着输出&数组名+1数组名+1,进行比较。


  • 数组作为函数传参时,形参可以写成两种形式:

一是数组形式,二是指针形式。

1
2
3
4
5
6
7
8
int arr[10];
//函数定义
void test(int arr[10]) //写法②:void test(int *arr){}
{
……
}
test(arr); //函数调用