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

目录

一、指针数组

1.1.什么是指针数组 

2.2. 格式

2.3.存储 

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

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

2.6.练习

二、数组指针 

2.1.什么是数组指针 

2.2.格式

 2.3.一维数组

2.3.特点 

2.4.什么时候使用

三、指针和数组的关系 

3.1.一维数组和指针 

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对应的数字,
 打印出其对应的英文形式。

#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.再次练习终端接受字符串,使用指针数组对字符串数组的元素进行冒泡排序并打印结果,并使用数组的方法打印字符串。

#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.格式

int (*p)[5] = NULL;

 2.3.一维数组

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

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.什么时候使用

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

int fun(int (*parry)[3],int len);


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

fun(a, 2);

三、指针和数组的关系 

3.1.一维数组和指针 

int a[5] = {1,2,3,4,5};

int *p = NULL;

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

        访问第n个元素的方式: 

a[n] == *(a+n) == *(p+n) == p[n]

3.2. 二维数组和指针

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列的元素,可以怎样访问:

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.函数体内想修改外部指针变量值传入二级指针 

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

        加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值