1.數組的基本概念
- 數組是相同類型的變量的有序集合
- 數組當中的元素沒有名字,我們只能通過數組名和下標來訪問數組中的元素。數組名a代表的是這5個存儲空間的集合。代表的是這一段內存。
- 數組在—片連續的內存空間中存儲元素,數組元素的個數可以顯示或隱式指定
#include <stdio.h>
int main()
{
int a[5] = { 1, 2 }; // 顯示指定
int b[] = { 1, 2 }; // 隱式指定
printf("a[2] = %d\n", a[2]);
printf("a[3] = %d\n", a[3]);
printf("a[4] = %d\n", a[4]);
printf("sizeof(a) = %d\n", sizeof(a));
printf("sizeof(b) = %d\n", sizeof(b));
printf("count for a: %d\n", sizeof(a) / sizeof(int));
printf("count for b: %d\n", sizeof(b) / sizeof(int));
return 0;
}
- 運行結果:
- 當我們指定數組中的一部分元素之後,其他的元素就會被初始化爲0,我們可以利用這個特性來講數組全部初始化爲0。做法爲int a[5] = {0}; 我們將第一個元素初始化爲0,其他的元素由編譯器默認初始化爲0。
2. 數組的地址與數組名
- 數組名代表數組首元素的地址
- 數組的地址需要用取地址符&才能得到
- 數組首元素的地址值與數組的地址值相同
- 數組首元素的地址與數組的地址是兩個不同的概念
#include <stdio.h>
int main()
{
int a[5] = { 0 };
printf("a = %p\n", a);
printf("&a = %p\n", &a);
printf("&a[0] = %p\n", &a[0]);
return 0;
}
- 運行結果:
- a:數組名,&a: 數組的地址,&a[0]:數組首元素地址
- 數組的地址包含兩層含義:一是數組的起始地址,二是所佔用的內存的長度(多少個字節)。
- 數組首元素地址也包含兩層含義:一是第一個元素的起始地址,二是第一個元素所佔內存的長度。
3.數組名與指針
- 數組名可以看做—個指針常量(int* const p)
- 數組名“指向”的是內存中數組首元素的起始位置
- 數組名不包含數組的長度信息
- 在表達式中數組名只能作爲右值使用
- 只有在下列場合中數組名不能看做指針常量
- 數組名作爲sizeof操作符的參數
- 數組名作爲&運算符的參數
#include<stdio.h>
int main()
{
int a[5] = { 0 };
int b[2];
int *p = NULL;
p = a;
printf("a = %p\n", a);
printf("p = %p\n", p);
printf("&p = %p\n", &p);
printf("sizeof(a) = %d\n", sizeof(a));
printf("sizeof(p) = %d\n", sizeof(p));
p = b;
printf("b = %p\n", b);
printf("p = %p\n", p);
printf("&p = %p\n", &p);
printf("sizeof(b) = %d\n", sizeof(b));
printf("sizeof(p) = %d\n", sizeof(p));
//b = a; //error: assignment to expression with array type
return 0;
}
- 運行結果:
- sizeof對指針和數組名操作時,結果是不一樣的。
- 數組名絕對不等於指針,而且不是指針,只是很多情況可以看成指針常量處理。
4.小結
- 數組是一片連續的內存空間;
- 數組的地址和數組首元素的地址意義不同;
- 數組名在大多數情況下被當成指針常量處理;
- 數組名其實並不是指針,不能將其等同於指針。