首页 > 其他分享 >嵌入式初学-C语言-二十

嵌入式初学-C语言-二十

时间:2024-08-11 17:59:46浏览次数:14  
标签:int 元素 len 嵌入式 ++ 初学 数组 C语言 指针

通过指针引用数组

数组元素的指针

数组指针:

        数组中第一个元素的地址,也就是数组的首地址

指针数组:

        用来存放数组元素地址的数组,称之为指针数组

// 定义一个一般数组
    int a[] = {1,4,9};
// 使用指针变量存储数组的第一个元素的首地址,也就是数组的首地址
    int *p = &a[0];// 数组首地址
// 在C语言中,由于数组名代表数组的首地址,因此,数组名实际上也是指针。
    int *p = a;
// 意味着:int *p = &a[0] 完全等价于 int *p = a;
    printf("%d\n",*p); // 1

注意:虽然我们定义了一个指针变量接收了数组地址,但不能理解为指针变量指向了数组,而应该理 解为指向了数组的元素。

在C语言中,由于数组名代表数组的首地址,因此,数组名实际上也是指针。

指针的运算:

指针运算:指针变量必须要指向数组中的某个元素

序号

指针运算

说明

1

自增:p++,++p,p=p+1(p+=1)

让指针变量指向下一个元素

2

自减:p--,--p,p=p-1(p-=1)

让指针变量指向上一个元素

3

加一个数:p+1

下一个元素的地址

4

减一个数:p-1

上一个元素的地址

5

指针相减:p1-p2

P1,p2之间相差几个元素

6

指针比较:p1<p2

前面的指针小于后面的指针

分别说明如下:

⑴ 如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的 下一个元素,p-1指向同一数组中的上一个元素。即p+1或p-1也表示地址。但要注意的是,虽然指针变量p中存放的是地址,但p+1并不表示该地址加1,而表示在原地址的基础上加了该数据类型所占的字节数d 。

⑵ 如果p原来指向a[0],执行++p后p的值改变了,在p的原值基础上加d,这样p就指向数组的下一个元素a[1]。d是数组元素占的字节数。

⑶ 如果p的初值为&a[0]则p+i 和a+i 就是数组元素a[i]的地址,或者说,它们指向a数组的第 i 个元素 。

(4) *(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即a[i]。

⑸ 如果指针变量p1和p2都指向同一数组,如执行p2-p1,结果是两个地址之差除以数组元素的长度d。

 案例1:

#include <stdio.h>
int main()
{
    // 一般数组
    int a[] = {1,3,5,7,9};
    // 计算数组中元素的个数
    // sizeof用法:sizeof(运算数) 或者 sizeof 运算数
    int len = sizeof a / sizeof a[0];
    // 创建指针变量
    int *p = a;
    // 创建循环变量
    register int i = 0;
    // 遍历
    for(;i < len; i++)
{
    printf("[1] %d ",a[i]); // 下标法
    printf("[2] %d ",*(a+i));// 指针法,但是这种写法,需要注意,a+i无法修改数组,只读
    printf("[3] %d ",*(p+i));// 指针法,这种更为灵活,可读可写,建议这种写法
    p++;
    // printf("%d\n",*p); // 等价于上面写法
    // p++;
}
    printf("\n");
    return 0;
}

案例2:

#include <stdio.h>
int main()
{
    int a[] = {10,22,33,44,55,66,77,88};
    int *p = a;// 等价于 int *p = &a[0] 元素:10
    p++;// 指针+1,元素值不改变 元素:22
    printf("%d\n",*p);// p = p + 1 元素:22
    int x = *p++;// x = 22,p++ -- *p:33
    printf("%d,%d\n",x,*p);// *p++:先*p,在p++, 元素:22,33
    int y = *(++p);// ++p, y = 44;
    printf("%d,%d\n",y,*p); // *(++p):先p++,再*p,元素:44,44
    (*p)++;// 元素值+1,指针不改变
    printf("%d\n",*p);// index为3的元素值:44 + 1 = 45
    return 0;
}

数组名做函数参数 

如果有一个实参数组,想在函数中改变此数组中的元素的值,实参与形参的对应关系有以下4种情况:

  •   形参和实参都用数组名
  •   实参用数组名,形参用指针变量。
  •   实参形参都用指针变量
  •   实参为指针变量,形参为数组名。
void fun(int *p1){}
void main()
{
// 注意:如果实参和形参都是指针,我们的实参需要初始化
int arr[2] = {23,34};
int *p0 = arr;
fun(p0);
}

 案例1:

/**
* 需求:将数组a中n个整数按相反顺序存放。
*/
#include <stdio.h>
/* 数组的反转:数组实现*/
void inv(int arr[],int len)
{
// 反转思路:将第0个和n-1个进行对掉,将第1个和n-2个对掉..
// 定义循环变量i,临时变量temp
int i = 0,temp;
// 遍历数组
for(;i < len/2;i++)
{
// 交换
temp = arr[i];
arr[i] = arr[len-1-i];
arr[len-1-i] = temp;
}
}
/*
数组的反转:指针实现
关键字:const 给变量的数据类型前面添加const,代表这个变量是只读变量,无法对此作出修改
*/
void inv2(int *arr,const int len)
{
// 反转思路:将第0个和n-1个进行对掉,将第1个和n-2个对掉..
// 定义循环变量i,临时变量temp *j = &arr[len -1] 等价于 arr + len -1
int *i = arr,*j = &arr[len-1],temp;
// 遍历数组
for(;i < j;i++,j--)
{
// 交换
temp = *i;
*i = *j;
*j = temp;
}
}
int main()
{
int array[10] = {12,23,45,55,66,77,88,26,34,32};
int len = sizeof(array)/sizeof(int);
inv2(array,len);
// 测试是否反转
for(int i = 0;i < len;i++) printf("%d,",array[i]);
printf("\n");
return 0;
}

标签:int,元素,len,嵌入式,++,初学,数组,C语言,指针
From: https://blog.csdn.net/MaBaB/article/details/141096667

相关文章

  • c语言 循环篇(for,while)
    1.for循环1.1语法形式for循环是三种循环中使⽤最多的,for循环的语法形式如下:1 for(表达式1;表达式2;表达式3)2 {3     语句;4 }表达式1⽤于循环变量的初始化。表达式2⽤于循环结束条件的判断。表......
  • C语言之高级数据讲解
    目录1高级数据1.1结构1.2从数组到链表1.3抽象数据类型(ADT)1.3.1讲解1.3.2实践1.4队列ADT1.4.1讲解1.4.2用队列进行模拟1.5链表和数组1.6二叉查找树1.6.1讲解1.6.2实践1高级数据1.1结构在开始编写代码之前,要做很多程序设计方面的决定。数组表示相对不灵活,在运行......
  • 在线仿真平台+C语言实现:STM32驱动0.96寸OLED屏幕显示DHT11温湿度传感器测量值
    这里推荐一款由深圳航天科技创新研究院推出的在线电路仿真软件,该软件不仅具备原理图绘制与代码编写功能,还支持在线编译代码、上传自定义代码以及进行仿真模拟,此外还能在线生成并允许下载.bin和.hex文件。官网地址如下:Document进入网页后先注册一个账号。  注册完账号后即可......
  • 与君初相识,犹如故人归(相遇c语言)
    标题:走进C语言的世界探索编程的奥秘1.什么是c语言2.main函数3.printf和库函数4.关键字介绍5.字符和ASCII编码6.字符串和\07.转义字符8.语句和语句分类9.注释是什么?为什么写注释?接下来让我们一起走进编程的入门一.中文是我们与人交流的方式(各种语言都......
  • C语言学习笔记 Day11(指针--下)
    Day11 内容梳理:目录Chapter7 指针7.6指针&函数(1)形参改变实参的值(2)字符数组作为函数参数1)合并字符串2)删掉字符串中空格(3)指针作为函数返回值Chapter7 指针7.6指针&函数(1)形参改变实参的值前文提到形参无法改变实参,但是通过使用指针就可以改变。因为在......
  • C语言进阶(6)
    1.结构体类型的声明和初始化结构体是一堆数据类型的集合体(与数组不同的是它可以是不同的数据类型)。结构体声明的是一个图纸,并不向内存申请空间,只有在设置变量的时候我们才进行划分空间给变量。结构体的变量数据类型可以理解成struct(结构体名),在初始化时我们就要牢记这个原则。......
  • 【C语言】字符函数和字符串函数
    目录一、字符函数(1)字符分类函数(2)字符转换函数二、字符串函数(1)strlen①函数原型②注意事项③模拟实现函数(2)strcpy①函数原型②注意事项③模拟实现函数(3)strcat①函数原型②注意事项③模拟实现函数(4)strcmp①函数原型②模拟实现函数(5)strncpy①函......
  • 堆总结(C语言)
    堆总结(C语言)二叉树的顺序结构及实现堆是什么堆的分类堆的实现堆的向下调整堆的向上调整堆的应用堆排序TOP-K问题思路:堆是什么堆总是一棵完全二叉树,堆是用来存完全二叉树的,如果存普通的二叉树就会浪费空间。堆(一种二叉树)使用顺序结构的数组来存储。堆不是简单的......
  • 【时时三省】(C语言基础)操作符3
    山不在高,有仙则名。水不在深,有龙则灵。             ----CSDN时时三省&取地址操作符示例: 每个内存单元都有自己的编号编号就成为内存单元的地址&a就是找出a的地址后面可以加一个int*pa=&a是可以用来存放地址pa是用来存放地址的-pa就是一......
  • 初识c语言
    什么是c语言c语言是一门计算机编程语言,可广泛用于底层开发。c语言是一种能以简易方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。第一个c语言程序入门第一个c语言代码如下:那么其运行的结果就是打印helloworld,运行结果如下:......