數組概述

摘要

主要對數組相關的基礎知識進行概述,主要內容有數組的定義及相關概念,數組的越界現象,數組空間的初始化,字符串處理的函數,非字符的內存處理,指針數組

數組的定義及相關概念

數組其實是內存分配的一種形式,其用法和指針十分類似。數組也是定義了一個內存空間。在初始化數組中,需要命名數組命”數據類型 數組名[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],與二級指針類似。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章