嵌入式学习Day12---C语言提升

目录

一、指针数组

1.1.什么是指针数组

[2.2. 格式](#2.2. 格式)

2.3.存储

2.4.与字符型二维数组相比

2.5.什么时候使用指针数组

2.6.练习

二、数组指针

2.1.什么是数组指针

2.2.格式

2.3.一维数组

2.3.特点

2.4.什么时候使用

三、指针和数组的关系

3.1.一维数组和指针

[3.2. 二维数组和指针](#3.2. 二维数组和指针)

四、二级指针

4.1.含义

4.2.实际的二级指针

4.3.什么时候使用

五、总结


一、指针数组

1.1.什么是指针数组

指针数组是数组 ,而数组中的每个元素是指针

2.2. 格式

int *arry[5];

2.3.存储

由于指针数组的类型为指针(int *),因此指针数组的每个元素占 8个字节。

int *a[5];故此该指针数组占右8*5=40字节的空间。

2.4.与字符型二维数组相比

字符型二维数组用来存储字符串数组;

指针数组用来操作字符串数组;

2.5.什么时候使用指针数组

操作字符串数组时

2.6.练习

一起来加深一下指针数组的印象

1.定义一个指针数组,并初始化为12个月英文字符串首地址,从终端输入1 - 12对应的数字,

打印出其对应的英文形式。

cpp 复制代码
#include <stdio.h>

int main(void)
{

	char *p[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
	int n = 0;

	scanf("%d", &n);

	printf("%s\n", p[n-1]);

	return 0;
}

2.再次练习终端接受字符串,使用指针数组对字符串数组的元素进行冒泡排序并打印结果,并使用数组的方法打印字符串。

cpp 复制代码
#include <stdio.h>
#include <string.h>

int main(void)
{

	char str[5][32] = {0};
	char *p[5] = {str[0], str[1], str[2], str[3], str[4]};
	char *q = NULL;
	int i = 0;
	int j = 0;

	for(i = 0; i < 5; i++)
	{
		gets(str[i]);
	}

	for(j = 0; j < 4; j++)
	{

		for(i = 0; i < 4 -j; i++)
		{
			if(strcmp(p[i], p[i+1]) > 0)
			{
				q = p[i];
				p[i] = p[i+1];
				p[i+1] = q;
			}
		}
	}

	printf("-----------------------------------\n");
	for(i = 0; i < 5; i++)
	{
		printf("%s\n", p[i]);
	
	}

	printf("-----------------------------------\n");
	for(i = 0; i < 5; i++)
	{
		printf("%s\n", str[i]);
	}

	return 0;
}

你会发现操作字符串时使用指针数组很方便,在使用冒泡排序时,原数组方法它要交换字符串来实现,而当字符串过大过多时效率很底;而指针数组在活得元素组字符串的地址后,交换时只需要交换地址就行效率很高。

二、数组指针

2.1.什么是数组指针

数组指针是指针,指针指向一个数组(二级指针)

2.2.格式

cpp 复制代码
int (*p)[5] = NULL;

2.3.一维数组

一维数组的数组名是指向第一个元素的指针常量

cpp 复制代码
int a[5] = {1,2,3,4,5};

a == &a[0]

一般情况,可以把数组名a理解为int *,但是存在两种特殊的情况不可以这么理解:

·sizeof运算时

sizeof(a) = 20

sizeof(int *) = 8

·&运算时

&a == int(*) [5](对一维数组取&会升级为数组指针)

&int * == int **

2.3.特点

1.对一维数组&得到数组指针

2.数组指针取*操作,类型不变,值降为指向数组第一个元素的指针

3.数组指针的变化量为整个数组大小

2.4.什么时候使用

二维数组传参数时,传数组指针和长度

cpp 复制代码
int fun(int (*parry)[3],int len);


int a[2][3] = {0};

fun(a, 2);

三、指针和数组的关系

3.1.一维数组和指针

cpp 复制代码
int a[5] = {1,2,3,4,5};

int *p = NULL;

p = a; / p = &a[0];

访问第n个元素的方式:

cpp 复制代码
a[n] == *(a+n) == *(p+n) == p[n]

3.2. 二维数组和指针

cpp 复制代码
int a[2][3] = {1,2,3,4,5,6};

int *p = NULL;

int (*p)[3] = NULL;

p = &a[0][0];

p = a[0];

q = a;

由于a[0]是由上图中的a[0][0]、a[0][1]、a[0][2]三个元素组成的一维数组,又有一维数组的数组名式是指向第一个元素的指针,故此p = a[0];

由于a[0][0]是a[0]数组的第一个元素,故此p = &a[0][0];

又由于a是由a[0]和a[1]两个一维数组组成的一维数组,又有一维数组的数组名式是指向第一个元素的指针,故此:q = a;

现在要访问第m行n列的元素,可以怎样访问:

cpp 复制代码
a[m][n]

*(a[m]+n)

*(*(a+m)+n)

*(p+m*N+n)

*(q[m]+n)

*(*(q+m)+n)

q[m][n]

四、二级指针

4.1.含义

指向指针变量的指针

4.2.实际的二级指针

1.函数体内想修改函数体外指针变量值的时候,传指针变量的地址即二级指针

2.指针数组的数组名是指向数组第一个元素的指针,即指向指针的指针也就是二级指针

4.3.什么时候使用

1.函数体内想修改外部指针变量值传入二级指针

cpp 复制代码
#include <stdio.h>

int fun(char **pptmp)
{
	*pptmp = "hello world";

	return 0;
}

int main(void)
{
	char *p = NULL;

	fun(&p);

	printf("p = %s\n", p);

	return 0;
}

结果为:p = hello world

2.指针数组的数组名是二级指针

五、总结

2024年7月24日,已经学习了12天啦!C语言的学习也接近尾声了。今天主要学习了指针数组、数组指针、二级指针,时指针中算是难的部分也是C语言中算是的难的部分了。努努力,争取今天消化了。

加油!

相关推荐
飞向星河44 分钟前
SV学习笔记——数组、队列
笔记·学习·c#
胡西风_foxww1 小时前
中学学习难点管理思维魔方
学习·中学·难点
Moonnnn.2 小时前
51单片机——程序执行过程(手工汇编)
汇编·笔记·嵌入式硬件·学习·51单片机
大宝剑1702 小时前
blender学习25.3.8
学习·blender
flashier8 小时前
C语言 进阶指针学习笔记
c语言·笔记·学习
大白的编程日记.8 小时前
【Linux学习笔记】Linux基本指令分析和权限的概念
linux·笔记·学习
螺旋式上升abc9 小时前
GO语言学习笔记
笔记·学习·golang
W起名有点难9 小时前
前端学习——CSS
前端·css·学习
Moonnnn.10 小时前
51单片机——汇编工程建立、仿真、调试全过程
汇编·笔记·嵌入式硬件·学习·51单片机
EnigmaCoder10 小时前
蓝桥杯刷题周计划(第二周)
学习·算法·蓝桥杯