國內(nèi)做的好看的網(wǎng)站設(shè)計杭州seo網(wǎng)絡(luò)推廣
C語言中,有一類數(shù)據(jù)結(jié)構(gòu),它可以存儲一組相同類型的元素,并且可以通過索引訪問這些元素,沒錯,這類數(shù)據(jù)結(jié)構(gòu)就是數(shù)組。數(shù)組可以說是C語言中非常重要的數(shù)據(jù)結(jié)構(gòu)之一了。使用數(shù)組可以是程序邏輯更加清晰,也更加具有可讀性。
1 數(shù)組的聲明和初始化
1)數(shù)組的聲明
在C語言中,數(shù)組的聲明方式如下:
type arrayName[arraySize];
- type:數(shù)組中元素的數(shù)據(jù)類型
- arrayName:數(shù)組的名字
- arraySize:數(shù)組的大小(即數(shù)組中可以存儲的元素個數(shù))
例如,聲明一個包含5個LED端口的數(shù)組:
GPIO_TypeDef* LED_PortLists[5];
聲明一個包含5個LED引腳的數(shù)組
uint16_t LED_PinLists[5];
2)數(shù)組的初始化
數(shù)組可以在聲明的同時進行初始化:
GPIO_TypeDef* LED_PortLists[5] =
{GPIOA,GPIOA,GPIOA,GPIOA,GPIOA,
};uint16_t LED_PinLists[5] =
{GPIO_Pin_10, GPIO_Pin_11, GPIO_Pin_12, GPIO_Pin_13, GPIO_Pin_14,
};
也可通過索引進行初始化,[index]中index為索引值。如:
GPIO_TypeDef* LED_PortLists[5] =
{[0] = GPIOA, [1] = GPIOA, [2] = GPIOA, [3] = GPIOA, [4] = GPIOA,
};uint16_t LED_PinLists[5] =
{[LED_DEBUG] = GPIO_Pin_10, [LED_FUN] = GPIO_Pin_11, [LED_RUN] = GPIO_Pin_12, [LED_TEMPEATATURE] = GPIO_Pin_13, [LED_FAULT] = GPIO_Pin_14,
};
如果初始化的元素個數(shù)少于數(shù)組大小,未初始化的元素會被自動賦值為0:
GPIO_TypeDef* LED_PortLists[5] = {0}; // 等價于 {0, 0, 0, 0, 0}
也可以省略數(shù)組大小,讓編譯器自動計算:
GPIO_TypeDef* LED_PortLists[] = {GPIOA, GPIOA, GPIOA, GPIOA, GPIOA}; // 數(shù)組大小自動為5
2 數(shù)組元素的訪問
數(shù)組元素可以通過索引訪問,索引從0開始:
uint16_t LED_DEBUG_PIN = LED_PinLists[0]; //訪問第一個元素
uint16_t LED_FUN_PIN = LED_PinLists[1]; //訪問第一個元素
可以通過索引修改數(shù)組元素的值:
LED_PinLists[0] = GPIO_Pin_9; // 將第一個元素的值修改為GPIO_Pin_9
在沒有引用數(shù)組類型前,我們前面是這樣來操作LED燈的。
void LED_DebugSetOn(void)
{GPIO_ResetBits(LED_DEBUG_PORT , LED_DEBUG_PIN); // 關(guān)閉
}void LED_DebugSetOff(void)
{GPIO_ResetBits(LED_DEBUG_PORT , LED_DEBUG_PIN); // 關(guān)閉
}void LED_DebugSet(bool value)
{if(value == false){GPIO_ResetBits(LED_DEBUG_PORT , LED_DEBUG_PIN); // 關(guān)閉} else{GPIO_SetBits(LED_DEBUG_PORT, LED_DEBUG_PIN); // 點亮}
}void LED_Set(LED_t led,bool value)
{switch (led){case LED_DEBUG:LED_DebugSet(value);break;default:break;}
}
在引用了數(shù)組類型后,代碼就變成了這樣:
void LED_Set(LED_t led,bool value)
{if(value == false){GPIO_ResetBits(LED_PortLists[led] , LED_PinLists[led] ); // 關(guān)閉} else{GPIO_SetBits(LED_PortLists[led] , LED_PinLists[led]); // 點亮}
}
3 二維數(shù)組
二維數(shù)組類似于矩陣,可以用兩個索引來訪問元素。聲明方式如下:
type arrayName[rows][columns];
- type:數(shù)組中元素的數(shù)據(jù)類型
- arrayName:數(shù)組的名字
- rows:數(shù)組中行數(shù)的大小
- columns:數(shù)組中列數(shù)的大小
例如,聲明一個2行3列的二維數(shù)組:
uint16_t LED_PinMatrixs[2][3];
二維數(shù)組的初始化:
uint16_t LED_PinMatrixs[2][3] =
{{GPIO_Pin_1, GPIO_Pin_2, GPIO_Pin_3},{GPIO_Pin_4, GPIO_Pin_5, GPIO_Pin_6},
};
可以通過兩個索引訪問二維數(shù)組的元素:
uint16_t LED_PinValue = LED_PinMatrixs[1][2]; // 訪問第一行第二列的元素,GPIO_Pin_2
LED_PinMatrixs[0][0] = GPIO_Pin_0; // 修改第一行第一列的元素
4 常見數(shù)組操作
1) 數(shù)組遍歷
通過循環(huán)遍歷數(shù)組的每個元素:
for (int i = 0; i < LED_NUM; i++)
{LED_Set((LED_t)i,true); //LED燈全亮
}
2) 查找元素
遍歷數(shù)組,查找特定元素的位置:
uint16_t LED_PinValue = GPIO_Pin_3;
int index = -1;
for (int i = 0; i < LED_NUM; i++)
{if (LED_PinLists[i] == LED_PinValue) {index = i;break;}
}
if (index != -1)
{printf("元素 %d 在數(shù)組中的位置是 %d\n", target, index);
}
else
{printf("數(shù)組中沒有找到元素 %d\n", target);
}
3) 元素移位
通過循環(huán)將數(shù)組中的元素依次向前移一位
uint16_t LED_PinValue = LED_PinLists[LED_NUM - 1];for(int i = LED_NUM - 1;i > 0;i--)
{LED_PinLists[i]=LED_PinLists[i-1];
}
LED_PinLists[0] = LED_PinValue;
4) 二維數(shù)組轉(zhuǎn)換為一維數(shù)組
int rows = 2;
int columns = 3;uint16_t LED_PinMatrixs[2][3] =
{{GPIO_Pin_1, GPIO_Pin_2, GPIO_Pin_3},{GPIO_Pin_4, GPIO_Pin_5, GPIO_Pin_6},
};uint16_t LED_PinList[rows * columns];
for (int i = 0; i < rows; i++)
{for (int j = 0; j < columns; j++) {LED_PinList[i * columns + j] = LED_PinMatrixs[i][j];}
}
5 數(shù)組名的本質(zhì)
數(shù)組名的本質(zhì)是指向該數(shù)組第一個元素的指針,關(guān)于指針,我們后面再討論
6 使用數(shù)組的注意事項
1)在通過數(shù)組索引訪問數(shù)組元素時,一定要注意數(shù)組的邊界,即索引大小應(yīng)小于數(shù)組元素的大小,5個數(shù)組元素,其索引值最大為4。
2)數(shù)組索引值從0開始計算。索引值應(yīng)大于等于0,且小于數(shù)組元素的大小。