嵌入式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是数组的地址,与数组指针类型相同

指针数组与数组指针的内存分配如下图:

时间: 2024-12-15 07:09:05

嵌入式Linux C语言(四)——指针与数组的相关文章

嵌入式linux C++语言(四)——类与对象

嵌入式linux C++语言(四)--类与对象 类的设计和使用如下: #include <iostream>#include <stdlib.h>#include <stdio.h>#include <string.h>using namespace std;class Stack{public:    Stack(int size=1024);    ~Stack();    void init();    bool isEmpty();    bool

嵌入式 Linux C语言(九)——C语言的安全问题和指针陷阱

嵌入式 Linux C语言(九)--C语言的安全问题和指针陷阱 C语言是灵活度和自由度较大的编程语言,作为C语言核心的指针更是让C语言程序员可以越过安全的栅栏,对某些内存区域进行破坏性访问,引发安全风险.很多安全问题都能追根溯源到指针的误用.本文将从指针的角度解读C语言常见的安全问题和指针陷阱. 一.指针的声明和初始化 1.不恰当的指针声明 int* ptr1, ptr2;//声明ptr1为int指针,ptr2为整型 int *ptr1, *ptr2;//ptr1,ptr2都声明为指针 #def

嵌入式Linux C语言(二)——指针

嵌入式Linux C语言(二)--指针 指针是C语言中广泛使用的一种数据类型,是C语言的灵魂.指针提供了动态操控内存的机制,强化了对数据结构的支持,而且实现了访问硬件的功能.学习指针是学习C语言中最重要的一环,能否正确理解和使用指针是我们是否掌握C语言的一个标志. 一.指针的概念 在计算机中,所有的数据都是存放在内存中的,一般把内存中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不一样,如int占用4个字 节,char占用1个字节.为了正确地访问内存单元,必须为每个内存单元编上号.

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

嵌入式Linux C语言(三)--指针与函数 指针对函数的功能有巨大的贡献,指针能够将数据传递给函数,并且允许函数对数据进行修改.指针对于函数的作用主要有两方面:将指针传递给函数和声明函数指针. 一.程序的栈和堆 程序的栈和堆是C语言程序运行的运行时元素. 1.程序栈 程序栈是支持函数执行的内存区域,通常和堆共享一块内存区域,通常程序栈占据内存区域的下部,堆用内存区域的上部.程序栈存放栈帧,栈帧存放函数参数和局部变量.调用函数时,函数的栈帧被推倒栈上,栈向上长出一个栈帧,当函数终止时,函数的栈帧

嵌入式 Linux C语言(五)——指针与字符串

嵌入式 Linux C语言(五)--指针与字符串 一.字符串简介 1.字符串声明 声明字符串的方式有三种:字面量.字符数组.字符指针. 字符串字面量是用双引号引起来的字符序列,常用来进行初始化,位于字符串字面量池中,字符字面量是用单引号引起来的字符. 字符串字面量池是程序分配的一块内存区域,用来保存组成字符串的字符序列.多次用到一个字符串字面量时,字符串字面量池中通常只保存一份副本,一般来说字符串字面量分配在只读内存中,是不可变的,但是当把编译器有关字面量池的选项关闭时,字符串字面量可能生成多个

嵌入式 Linux C语言——C语言基础

嵌入式 Linux C语言--C语言基础 一.数据类型 1.基本数据类型 数据类型是创建变量的模型.变量名是连续存储空间的别名,程序中使用变量命名存储空间,通过变量可以使用存储空间.变量所占的内存大小取决于创建变量的数据类型. 2.有符号和无符号 有符号数中数据类型的最高位用于标识数据的符号,最高位为1表示为负数,最高位为0表示为正数. 计算机中有符号数通常使用补码表示,正数的补码为正数本身,负数的补码为负数的绝对值的各位取反后加1. 计算机中无符号数通常使用原码表示,无符号数默认为正数,没有符

嵌入式linux C++语言(二)——C++对C语言基础语法的扩展

嵌入式linux C++语言(二)--C++对C语言基础语法的扩展 C++是基于C语言扩展发展而来的面向对象的程序设计语言,本文将主要讨论C++语言基于C语言扩展的方面. 一.类型增强 1.类型检查更严格 在C语言中: const int a = 100; int *p = &a; 在C++语言中: const int a = 100;//必须在定义的时候初始化 const int *p = &a; 在C++语言中不能隐式转换数据类型. error: invalid conversion

嵌入式linux C++语言(六)——运算符重载

嵌入式linux C++语言(六)--运算符重载 运算符重载的本质是函数重载. 一.重载基础 1.运算符重载的语法 返值类型 operator 运算符名称(形参表列){    重载实体;} 2.友元重载 可以将运算符重载函数声明位友元函数 #include <iostream> using namespace std; class Complex { public:     Complex(float x=0, float y=0)         :_x(x),_y(y){}     voi

嵌入式 Linux C语言(八)——存储类型、作用域、生命周期、链接属性

嵌入式 Linux C语言(八)--存储类型.作用域.生命周期.链接属性 一.存储类型 C语言中,每个变量和函数都有两个属性:数据类型和数据的存储类型. 变量的存储类型是指存储变量值的内存类型.变量的存储类型决定变量何时创建.何时销毁以及它的值将保持多久.计算机中有三个地方可以用于存储变量:普通内存,运行时堆和栈,硬件寄存器.变量的存储类型取决于声明变量的位置. C语言存储类别说明符: 说明符 用    法 auto 只在代码块内变量声明中被允许, 表示变量具有本地生存期 extern 出现在顶