深刻理解C語言-深刻理解數組

數組,做爲C語言中常見的複雜數據類型,瞭解其本質有助於深刻了解C語言web

數組概念

元素類型角度:數組是相同類型的變量的有序集合測試指針變量佔有內存空間大小
內存角度:聯繫的一大片內存空間
數組概念數組

數組初始化

數組元素的個數能夠顯示或隱式指定
數組的初始化能夠用{ 0 },也能夠使用memset初始化svg

int main()
{
	int i = 0;
	int a[10] = { 1, 2 }; //其餘初始化爲0
	int b[] = { 1, 2 };
	int c[20] = { 0 };
 
	for (i = 0; i < 10; i++)
	{
		printf("%d ", a[i]);
	}
	memset(a, 0, sizeof(a));
	getchar();
	return 0;	
}

關於數組名的一些問題

  1. 數組首元素的地址和數組地址是兩個不一樣的概念,前者表明一個元素大小,後者表明一個和數組大小
  2. 數組名錶明數組首元素的地址,它是個常量,其本質就是一個變量的別名
  3. 數組首元素的地址和數組的地址值相等
  4. 數組的類型由元素類型和數組大小共同決定,e.g. int[5]

數組類型的自定義

typedef int(MYINT5)[5];
···
MYINT5i Array; //int Array[5];

數組指針

數組指針用於指向一個數組函數

  1. 經過數組類型定義數組指針
typedef int(ArrayType)[5];
ArrayType* pointer;

用數組類型加*定義一個數組指針測試

void main(void)
{
    int a[5];//聲明一個數組類型
    typedef int(MYINT5)[5];//用數組類型 加*,定義一個數組指針變量
    MYINT5 *array;
    array = &a;

    for (i = 0; i < 5; i++)
    {
        (*array)[i] = i;
    }
    
    for (i = 0; i < 5; i++)
    {
        printf("\n%d %d", a[i], (*array)[i]);
    }
}
  1. 聲明一個數組指針類型
typedef int (*MyPointer)[5];

定義一個數組指針類型,而後用類型定義變量spa

void main(void)
{
    int b[5];//聲明一個數組指針類型
	typedef int (*MyPointer)[5];//用數組指針類型,去定義一個變量
	MyPointer mypoint;
	mypoint= &b;

	for (i = 0; i < 5; i++)
	{
		(*mypoint)[i] = i;
	}

	for (i = 0; i < 5; i++)
	{
		printf("\n%d %d", b[i], (*mypoint)[i]);
	}
}
  1. 直接定義
int (*pointer)[n];

直接定義一個數組指針變量設計

void main(void)
{
    int c[5];
	int (*pointer)[5] = &c;//直接聲明一個數組指針變量
	for (i = 0; i < 5; i++)
	{
		(*pointer)[i] = i;
	}

	for (i = 0; i < 5; i++)
	{
		printf("\n%d %d", c[i], (*pointer)[i]);
	}
}

一維數組本質

int a[5] 一維數組名錶明數組首元素的地址
int a[5] ==> a的類型爲int*指針

二維數組本質

實驗:code

int arr[3][4];
printf("arr:%d, arr + 1:%d", arr, arr + 1);

此時輸出打印的結果相差16,也就是4 * 4,經過這個契機,得出二維數組名的本質
arr的本質是一個數組指針,每次向後移動一維的長度xml

說明 寫法 寫法 寫法
第0行第1列元素地址 a [0]+1 *a+1 &a[0][1]
第1行第2列元素地址 a [1]+2 *(a+1)+2 &a[1][2]
第 i 行第 j 列元素地址 a [i]+j *(a+i)+j &a[i][j]
第1行第2列元素的值 *(a [1]+2) *( *(a+1)+2) a[1][2]
第 i 行第 j 列元素的值 *(a [i]+j) *( *(a+i)+j) a[i][j]

正是由於有了這些特性,二維數組在作函數參數的時候,會退化爲二級指針,這樣設計的目的在於參數傳遞的時候不用傳遞太多數據,數組指針作函數參數,通常只會使用到二維
char buf[3][4] ==> char buf[][4] ==> char (*buf)[4]

多維數組的線性存儲特性

多維數組在內存中是線性存儲的,即按照低維到高維線性排序

char buf[2][3];

buf[0][0]·buf[0][1]·buf[0][2]·buf[1][0]·buf[1][1]·buf[1][2]

數組作函數參數

因爲C語言中只會以機械式的值拷貝的方式傳遞參數(實參把值傳給形參),因此在數組作函數參數的時候,是無法知道數組大小的,須要額外傳遞數組大小數據

int fun(char a[20], size_t b)
{
   printf("%d\t%d",b,sizeof(a));
}

二維數組能夠看作是一維數組
二維數組中的每一個元素是一維數組
二維數組參數中第一維的參數能夠省略
void f(int a[5]); ==> void f(int a[]); ==> void f(int* a);
void g(int a[3][3]) ==> void g(int a[][3]); ==> void g(int (*a)[3]);

相關文章
相關標籤/搜索