嵌入式学习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语言中算是的难的部分了。努努力,争取今天消化了。

加油!

相关推荐
moxiaoran57531 小时前
uni-app学习笔记二十九--数据缓存
笔记·学习·uni-app
pop_xiaoli3 小时前
OC—UI学习-2
学习·ui·ios
Lin Hsüeh-ch'in3 小时前
Vue 学习路线图(从零到实战)
前端·vue.js·学习
恰薯条的屑海鸥4 小时前
零基础在实践中学习网络安全-皮卡丘靶场(第十五期-URL重定向模块)
学习·安全·web安全·渗透测试·网络安全学习
moxiaoran57536 小时前
uni-app学习笔记三十--request网络请求传参
笔记·学习·uni-app
嘉陵妹妹6 小时前
深度优先算法学习
学习·算法·深度优先
乖乖是干饭王7 小时前
Linux系统编程中的_GNU_SOURCE宏
linux·运维·c语言·学习·gnu
待什么青丝8 小时前
【TMS570LC4357】之相关驱动开发学习记录2
c语言·arm开发·驱动开发·单片机·学习
行云流水剑8 小时前
【学习记录】如何使用 Python 提取 PDF 文件中的内容
python·学习·pdf
虾球xz9 小时前
CppCon 2015 学习:CLANG/C2 for Windows
开发语言·c++·windows·学习