c語言深度剖析(27)—數組的本質分析

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.小結

  • 數組是一片連續的內存空間; 
  • 數組的地址和數組首元素的地址意義不同; 
  • 數組名在大多數情況下被當成指針常量處理; 
  • 數組名其實並不是指針,不能將其等同於指針。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章