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語言數組的各種特性。