嵌入式Linux C语言——指针与数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式Linux C语言——指针与数组相关的知识,希望对你有一定的参考价值。

嵌入式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

以上是关于嵌入式Linux C语言——指针与数组的主要内容,如果未能解决你的问题,请参考以下文章

极简嵌入式C语言教程——从入门到入土

极简嵌入式C语言教程——从入门到入土

极简嵌入式C语言教程——从入门到入土

C语言指针指向一维数组与二维数组?

嵌入式Linux C语言——指针与函数

C 语言数组与指针操作 ( 数组符号 [] 与 指针 * 符号 的 联系 与 区别 | 数组符号 [] 与 指针 * 符号 使用效果 基本等价 | 数组首地址 与 指针 本质区别 )