歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> 嵌入式Linux C語言(四)――指針與數組

嵌入式Linux C語言(四)――指針與數組

日期:2017/3/3 11:54:15   编辑:Linux技術

嵌入式Linux C語言(四)――指針與數組

數組是C語言內建的數據結構,徹底理解數組及其用法是開發高效應用程序的基礎。數組和指針緊密關聯,但又不是完全可以互換。

一、數組簡介

數組是能用索引訪問的同種類型元素的連續集合。數組的元素在內存中是相鄰的,中間不存在空隙,數組的元素是相同類型的。

1、數組的解讀

數組的定義:int a[10] = {0,1,2,3,4,5};
a[0]:數組的第一個元素,首元素(做左值時表示第0個元素的內存空間)
&a:數組的首地址,是常量,不能做左值,類型等同int (*)[10]。
&a[0]:數組第0個元素的地址,
a:a是數組名,不能做左值,做右值時表示數組首元素的地址,與&a[0]相同。

2、一維數組

一維數組是線性結構,用一個索引訪問成員。int vector[5] = {1,2,3,4,5};數組的內部表示不包含其元數數量的信息,數組名字只是引用了一塊內存。

3、二維數組

二維數組使用行和列來標識數組元素,二維數組可以看作是數組的數組。
int vetor[2][3] = {{1,2,3},{4,5,6}};

二、數組和指針表示法

1、數組元數的訪問方式

A、數組下標訪問
數組名[索引下標];B、指針方式訪問*(指針+偏移量);
*(a + 2);//等價於a[2]
數組中的元數地址是連續的。
C語言沒有強制規定數組的邊界,因此用無效的索引訪問數組將會造成數組訪問越界,造成不可預期的行為。

2、數組與指針的區別

int vector[5] = {1,2,3,4,5};
int *p = vector;
vector[i]訪問數組元素的方式表示從地址vector開始,移動i個位置取出內容
*(vetcor+i)訪問數組元素方式表示從vector開始,在地址上增加i,取出地址中的內容。
sizeof(vector)得到的是數組分配的字節數
sizeof(p)得到的是指針變量p的長度

三、數組作為函數參數

1、傳遞一維數組

將一維數組作為參數傳遞給函數實際上是通過值來傳遞數組的地址,不需要傳遞整個數組,不用再棧上分配空間,通常也需要傳遞數組長度,確保對數組的訪問不會越界。在函數聲明中聲明數組的方法有兩種:A、數組表示法
void display(int a[], int size);通過使用sizeof(a)計算數組的元數數量是錯誤的,sizeof(a)/sizeof(int)是正確的。B、指針表示法void display(int *a, int size);

2、傳遞多維數組

傳遞多維數組時,需要在函數原型聲明中確定用數組表示法還是指針表示法,以及數組的維數和每一維的大小。要想在函數內部使用數組表示法,必須指定數組的形態,否則編譯器將無法使用下標。void display(int a[][5], int rows);
void display(int (*a)[5], int rows);
void display(int *a[5], int rows);//錯誤聲明,語法沒錯,但是編譯器會認為函數傳入的數組有5個整型指針。
傳遞二維以上數組時,除了第一維以外,需要指定其他維度的長度。

四、數組指針

int *vector[5];//指針數組,數組中元素的是指針變量
int (*p)[5];//數組指針
數組指針是指向數組的指針變量,數組指針持有的是數組的地址,相當於一個二級指針。
int a[5];
p = &a;//&a是數組的地址,與數組指針類型相同
指針數組與數組指針的內存分配如下圖:



本文出自 “生命不息,奮斗不止” 博客,請務必保留此出處http://9291927.blog.51cto.com/9281927/1789775
Copyright © Linux教程網 All Rights Reserved