C-数组

C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。

所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。

1
int a[2] = {1,2};

(a+i) 就代表的是 a[0+i] 的地址。

声明数组

C 中要声明一个数组,需要指定元素的类型和元素的数量:

一维数组

1
2
3
type arrayName [ arraySize ];

double balance[10];

arraySize 必须是一个大于零的整数常量,type 可以是任意有效的 C 数据类型。

初始化数组

在 C 中,您可以逐个初始化数组,也可以使用一个初始化语句,如下所示:

1
double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};

大括号 {} 之间的值的数目不能大于在数组声明时在方括号 [] 中指定的元素数目。

所有的数组都是以 0 作为它们第一个元素的索引,也被称为基索引,数组的最后一个索引是数组的总大小减去 1。

可以只给部分元素赋值,当 {} 中值的个数少于元素个数时,只给前面部分元素赋值。例如:

1
int a[10]={12, 19, 22 , 993, 344};

表示只给 a[0]~a[4] 5 个元素赋值,而后面 5 个元素自动初始化为 0。

当赋值的元素少于数组总体元素的时候,不同类型剩余的元素自动初始化值说明如下:

  • 对于 short、int、long,就是整数 0
  • 对于 char,就是字符 \0
  • 对于 float、double,就是小数 0.0

可以通过下面的形式将数组的所有元素初始化为 0:

1
2
3
int nums[10] = {0};
char str[10] = {0};
float scores[10] = {0.0};

由于剩余的元素会自动初始化为 0,所以只需要给第 0 个元素赋值为 0 即可。

  1. 只能给元素逐个赋值,不能给数组整体赋值。例如给 10 个元素全部赋值为 1,只能写作:
1
int a[10] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1};

而不能写作:

1
int a[10] = 1;

访问数组元素

数组元素可以通过数组名称加索引进行访问。元素的索引是放在方括号内,跟在数组名称的后边。例如:

1
double salary = balance[9];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>

int main ()
{
int n[ 10 ]; /* n 是一个包含 10 个整数的数组 */
int i,j;

/* 初始化数组元素 */
for ( i = 0; i < 10; i++ )
{
n[ i ] = i + 100; /* 设置元素 i 为 i + 100 */
}

/* 输出数组中每个元素的值 */
for (j = 0; j < 10; j++ )
{
printf("Element[%d] = %d\n", j, n[j] );
}

return 0;
}

指针与数组名的区别

  • 指针:也是一个变量,存储的数据是地址。
  • 数组名:代表的是该数组最开始的一个元素的地址。

实际上数组是 const 的指针,所以不能被赋值。 如果 int a[] = {1,2,5,7}; int b[],由于 int b[] 实质上等价于 int const *b;
b 是一个常数,不能被改变,初始化出来代表这个数组就不能再改变。 b = a; (错误) 数组变量之间是不可以这样互相赋值的。 而 int *q = a; 这样是可以的。

1
2
3
int a[10];
int *p;
p = &a[0] // 可以写成 p = a;

1,对数组元素 a[i]的引用也可以写成 *(a+i)这种形式。
2,赋值语句 p=&a[0] 也可以写成下列形式: p=a
3,p 是个指针,p[i]*(p+i) 是等价的。
区别:指针是一个变量,可以进行数值运算。数组名不是变量,不可以进行数值运算。

字符数组与字符串

1
2
char *str="Hello";
char arrgs[]="Hello"; // 这样赋值之后在结尾会自动加上'\0'。

字符数组:

1
2
char *p=(char*)&arrgs == char *p=arrgs ;
char *p=(char*)(&(arrgs[0])) == &arrgs == arrgs;

字符串指针:

1
char *p=(char*)&str != str; str==str[0] =='H'

字符数组的首地址可以用 arrgs&arrgs,来表示并且它们相等,但是指针&strstr是不同的。