嵌入式学习第十一天

7.数组和指针的关系:

(1)一维数组和指针的关系:
        int a[5] = {1, 2, 3, 4, 5};
        int *p = NULL;
        p = &a[0];
        p = a;
        数组的数组名a是指向数组第一个元素的一个指针常量
        a == &a[0]      
        a 的类型可以理解为 int *

        访问下标为n的数组元素的方式:
        a[n] == *(a+n) == *(p+n) == p[n]

(2)一维数组传参:
        int a[5] = {0};
        int Fun(int *parray, int len);

(3)一维字符型数组传参:
        char str[32] = {0};
        int Fun(char *pstr, int len);

(4)字符串传参:
        char str[32] = {"hello world"};
        int Fun(char *pstr);
注意:

字符串遍历:

 char str[32] = {"hello world"};
            char *pstr = NULL;
            pstr = str;
            while (*pstr != '\0')
            {
                pstr++;
            }

练习:封装一个函数MyStrcpy实现strcpy的功能

#include 
#include 

int MyStrcpy(char *pdst, char *psrc)
{
	while (*psrc != '\0')
	{
		*pdst = *psrc;
		pdst++;
		psrc++;
	}
	*pdst = '\0';

	return 0;
}

int main(void)
{
	char src[32] = {0};
	char dst[32] = {0};

	gets(src);

	MyStrcpy(dst, src);

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

	return 0;
}


练习:封装一个函数MyStrcat实现strcat的功能

#include 

int MyStrcat(char *pstr1, char *pstr2)
{
	while (*pstr1 != '\0')
	{
		pstr1++;
	}

	while (*pstr2 != '\0')
	{
		*pstr1 = *pstr2;
		pstr1++;
		pstr2++;
	}

	*pstr1 = '\0';

	return 0;
}

int main(void)
{
	char str1[32] = {0};
	char str2[32] = {0};

	gets(str1);
	gets(str2);

	MyStrcat(str1, str2);

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

	return 0;
}


练习:封装一个函数MyStrcmp实现strcmp的功能

#include 

int MyStrcmp(char *pstr1, char *pstr2)
{	
	while (*pstr1 == *pstr2 && *pstr1 != '\0')
	{
		pstr1++;
		pstr2++;
	}

	return *pstr1 - *pstr2;
}

int main(void)
{
	char str1[32] = {0};
	char str2[32] = {0};
	int ret = 0;

	gets(str1);
	gets(str2);

	ret = MyStrcmp(str1, str2);
	
	printf("ret = %d\n", ret);

	return 0;
}

练习:封装一个函数,给定一个字符串,统计该字符串中大写字母、小写字母、数字和空格的个数

#include 

int GetNum(char *pStr, int *pDaXie, int *pXiaoXie, int *pShuzi, int *pKongge)
{
	int cnt_daxie = 0;
	int cnt_xiaoxie = 0;
	int cnt_shuzi = 0;
	int cnt_kongge = 0;

	while (*pStr != '\0')
	{
		if (*pStr >= 'A' && *pStr <= 'Z')
		{
			cnt_daxie++;
		}
		else if (*pStr >= 'a' && *pStr <= 'z')
		{
			cnt_xiaoxie++;
		}
		else if (*pStr >= '0' && *pStr <= '9')
		{
			cnt_shuzi++;
		}
		else if (' ' == *pStr)
		{
			cnt_kongge++;
		}

		pStr++;
	}

	*pDaXie = cnt_daxie;
	*pXiaoXie = cnt_xiaoxie;
	*pShuzi = cnt_shuzi;
	*pKongge = cnt_kongge;

	return 0;
}

int main(void)
{
	char str[256] = {0};
	int DaXieCnt = 0;
	int XiaoXieCnt = 0;
	int ShuziCnt = 0;
	int KonggeCnt = 0;

	gets(str);

	GetNum(str, &DaXieCnt, &XiaoXieCnt, &ShuziCnt, &KonggeCnt);

	printf("大写:%d\n", DaXieCnt);
	printf("小写:%d\n", XiaoXieCnt);
	printf("数字:%d\n", ShuziCnt);
	printf("空格:%d\n", KonggeCnt);

	return 0;
}

8.数组指针和指针数组:

数组指针是指针,指针指向一个数组
指针数组时数组,数组每个元素都是指针类型

int *a[5] = {NULL};
定义一个指针数组,数组占40个字节空间,每个元素为int *型,共5个元素

int (*a)[5] = NULL;
定义一个数组指针变量,占8个字节空间,指针指向了一个int类型5个元素的数组

(1)数组指针:
        int a[5];
        &a:获得数组的首地址,其类型为int (*)[5]
注意:
        对一维数组数组名&,值不变,类型升级为数组指针类型
        对数组指针*,值不变,类型降级成为指向数组第一个元素的指针

嵌入式学习第十一天_第1张图片

作业:

    1.封装一个函数实现MyStrlen实现strlen的功能
    2.封装一个函数实现MyStrcpy实现strcpy的功能
    3.封装一个函数实现MyStrcat实现strcat的功能
    4.封装一个函数实现MyStrcmp实现strcmp的功能

嵌入式学习第十一天_第2张图片嵌入式学习第十一天_第3张图片嵌入式学习第十一天_第4张图片

    5.封装一个函数实现字符串的倒置(逆序)
      int InvertString(char *pstr);

嵌入式学习第十一天_第5张图片
    
    6.从终端输入一个a和n封装函数按照如下公式获得结果

嵌入式学习第十一天_第6张图片嵌入式学习第十一天_第7张图片

你可能感兴趣的:(学习,c语言,开发语言)