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

加油!

相关推荐
oneouto11 分钟前
selenium学习笔记(二)
笔记·学习·selenium
sealaugh3216 分钟前
aws(学习笔记第十九课) 使用ECS和Fargate进行容器开发
笔记·学习·aws
炭烤玛卡巴卡43 分钟前
学习postman工具使用
学习·测试工具·postman
thesky1234561 小时前
活着就好20241224
学习·算法
蜗牛hb1 小时前
VMware Workstation虚拟机网络模式
开发语言·学习·php
汤姆和杰瑞在瑞士吃糯米粑粑2 小时前
【C++学习篇】AVL树
开发语言·c++·学习
虾球xz2 小时前
游戏引擎学习第58天
学习·游戏引擎
奶香臭豆腐2 小时前
C++ —— 模板类具体化
开发语言·c++·学习
波音彬要多做3 小时前
41 stack类与queue类
开发语言·数据结构·c++·学习·算法
m0_748256784 小时前
WebGIS实战开源项目:智慧机场三维可视化(学习笔记)
笔记·学习·开源