摘要
主要對數組相關的基礎知識進行概述,主要內容有數組的定義及相關概念,數組的越界現象,數組空間的初始化,字符串處理的函數,非字符的內存處理,指針數組
數組的定義及相關概念
數組其實是內存分配的一種形式,其用法和指針十分類似。數組也是定義了一個內存空間。在初始化數組中,需要命名數組命”數據類型 數組名[SIZE]“SIZE表示數組中元素的個數,每一個元素是前面數據類型定義的。
注意在數組的使用中仍然可能存在越界的情況。
程序如下:
#include <stdio.h>
int main (void )
{
int a[3]={1,2,3};
const int b=0;
a[3]=40;
printf("b=%d\n",a[3]);
return 0;
}
通過如上程序,運用a數組越界賦值就能修改b的內容,儘管b是用const修飾的。運行結果如下所示。
由此可知,指針與數組在指向地址的時候有很多類似的地方,但是,數組也有自己獨到的地方,比如數組名其實是一個常量,數組名是不能改變的。所以數組名也同樣不能運用a++運算。
數組的運用a[i]=XXX,在通常情況下i是大於等於0的,但是如果用a[-1]也是可以得,只是數組越界向下進行指向,編譯器是不會報錯的。
數組的空間初始化
1、按照標籤逐一處理
int a[10];//[0-9]
a[0]=xx;
a[1]=xx;
2、利用編譯器逐一處理:注意第一次的賦值初始化,其具體用法如下所示:
int a[10] ={0,1,2,3,4,5,6,7,8,9};//其實這一部分編譯器也會逐一對每個元素進行復制
注意:數組空間的初始化和變量的初始化本質不同,在嵌入式開發過程中,尤其是裸機開發的時候,空間初始化往往需要調用庫函數或者單獨爲之設計程序
char buff[10]={'a','b','c'};
(1)buf存放的數據,對格式沒有要求;
(2)buf存放的是字符串,則需要以’/0’作爲結束符
char buff[]={"Hello World\n"};
char buff[5]={"abc"};
char buff[]="abc";//"abc"是可以改變的
char *p = "abc";//"abc"是一個常量,不能改變
3、再次賦值:需要對每個元素進行逐一處理。
經典錯誤:buff=”fgh”;
在C語言中也有一些針對字符串的函數,可以調用 string.h中
#include <stdio.h>
#include <string.h>
int main (void )
{
char buff1[]="Hello World.";
char buff2[]="abc";
strcpy(buff1,"abc");
strcpy(buff2,"Hello World");
printf("the buff1 is \" %s\" .\n",buff1 );
printf("The buff2 is \" %s \" .\n",buff2);
return 0
雖然數組修改了,但是也出現了一些錯誤,錯誤先不進行深入分析。可以看出這個函數雖然功能可以滿足複製數組的功能,但是可能存在內存的泄露,在使用中要十分慎重。在通常使用中,常常使用strncpy。
非字符空間
比如數據採集,在AD採集可能存在數據在0x00-0xFF當中。
如果運用 char buf[10]進行聲明,可能與字符串產生歧義。因此在實際工程中通常運用 unsigned char buf[10]。
:**注意:1、由於buf中的數據不是字符串,因此不能用string.h的函數。
2、數據的copy通常運用memcpy函數**
函數memcpy (目的地址,源地址,字節):
int buf1[10];
int buf2[20];
memcpy(buf1,buf2,10*sizeof(int));
指針數組
定義方式:int * a[100],與二級指針類似。