c語言深度剖析(32)—數組指針和指針數組分析

1. 思考題:下面的聲明合法嗎?

int array[5];
int matrix[3][3];
int *pa = array;
int *pm = matrix;
  • 合法,第一個爲標準數組的定義,第二個爲二維數組的定義,第三個爲指向數組的指針,第四個爲指向二維數組的指針。
  • 問題:
    • array代表數組首元素的地址,那麼matrix代表什麼?
    • array和&array的地址值相同,但意義不同,那麼它們所代表的類型相同嗎?
    • 在二維數組的時候就不能用數組名錶達數組首元素了,matrix不再代表數組首元素的地址。

2.數組類型

  • C語言中的數組有自己特定的類型
  • 數組類型由元素類型數組大小共同決定;如:int array[5] 的類型爲 int[5]。

3. 定義數組類型

  • C語言中通過typedef爲數組類型重命名:typedef type(name)[size];
// 數組類型:
typedef int(AINT5)[5];
typedef float(AFLOAT10)[10];
// 數組定義:
AINT5 iArray;
AFLOAT10 fArray;

4.數組指針

  • 數組指針用於指向一個數組 
  • 數組名是數組首元素的起始地址,但並不是數組的起始地址
  • 通過取地址符&作用於數組名可以得到數組的起始地址 
  • 可通過數組類型定義數組指針:ArrayType* pointer 
  • 也可以直接定義:type(*pointer)[n]; 
  • pointer爲數組指針變量名;type爲指向的數組的元素類型;n爲指向的數組的大小

5.編程實驗

  • 數組類型和數組指針示例
#include <stdio.h>

typedef int(AINT5)[5];
typedef float(AFLOAT10)[10];
typedef char(ACHAR9)[9];

int main()
{
	AINT5 a1;
	float fArray[10];
	AFLOAT10* pf = &fArray;
	ACHAR9 cArray;

	char(*pc)[9] = &cArray;
	char(*pcw)[4] = cArray;

	int i = 0;

	printf("%d, %d\n", sizeof(AINT5), sizeof(a1));

	for (i = 0; i < 10; i++)  // 通過數組指針賦值
	{
		(*pf)[i] = i;     // ==> fArray[i] = i;
	}

	for (i = 0; i < 10; i++)
	{
		printf("%f\n", fArray[i]);
	}

	printf("%p, %p, %p\n", &cArray, pc + 1, pcw + 1);  // pc + 1 ==> (unsigned int )pc + 1 * sizeof(*pc) ==> (unsigned int)pc + 9

	return 0;
}
  • 運行結果:

6. 指針數組

  • 指針數組是一個普通的數組 
  • 指針數組中每一個元素爲一個指針 
  • 指針數組的定義:type* pArray[n]; 
  • type*:爲數組中每個元素的類型(帶有*,可知是一個指針類型) pArray:爲數組名; n:數組大小 

7.編程實驗

  • 工程中的指針數組應用示例
#include <stdio.h>
#include <string.h>

#define DIM(a) (sizeof(a)/sizeof(*a))

int lookup_keyword(const char *key, const char *table[], const int size)
{
	int ret = -1;

	int i = 0;

	for (i = 0; i < size; i++)
	{
		if (strcmp(key, table[i]) == 0)
		{
			ret = i;
			break;
		}
	}

	return ret;
}

int main()
{
	const char *keyword[] = 
	{
			"do",
			"for",
			"if",
			"register",
			"return",
			"switch",
			"while",
			"case",
			"static"
	};

	printf("%d\n", lookup_keyword("return", keyword, DIM(keyword)));
	printf("%d\n", lookup_keyword("main", keyword, DIM(keyword)));

	return 0;
}
  • 運行結果:

8. 小結

  • 數組的類型由元素類型數組大小共同決定
  • 數組指針是一個指針,指向對應類型的數組
  • 數組指針遵循指針運算法則 
  • 指針數組是一個數組,其中每個元素都是指針
  • 指針數組擁有C語言數組的各種特性。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章