嵌入式学习第二篇——C语言基础11

1.指针数组:


    int *a[5];

    char *str[5];

    指针数组主要用来操作字符串数组,通过将指针数组的每个元素存放字符串的首地址实现对多个字符串的操作


    二维数组主要用来存储字符串数组,通过每行存储一个字符串,多行存储多个字符串所组成的数组

具体如下:

#include

int main(void)
{
	int a[5] = {1,2,3,4,5};
	int (*p)[5] = NULL;
	int i = 0;

	p = &a;

	printf("%p\n",a);

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

	for(i = 0;i < 5;i++)
	{
		printf("%d\n",*(*p + i));
	}

	return 0;
}

1,数组指针,指针,数据之间的关系

                int a[m][n] = {0};

数组指针         第一组第一个元素首地址        a                 a

   指针                   第一个元素首地址           a[m]          *(a+m)

   数据                         第一个元素              a[m][n]     *(*(a+m)+n)

2.指针和二维数组的关系:


    int a[2][3] = {0};
    int *p = NULL;
    int (*q)[3] = NULL;

    p = &a[0][0];
    p = a[0];
    p = *a;
    q = a;

#include

int main(void)
{
	int a[2][3] = {1,2,3,4,5,6};
	int *p = NULL;
	int (*q)[3] = NULL;
	p = *a;
	q = a;
	
	printf("==================================\n");
	printf("a[1][1]=%d\n",a[1][1]);
	printf("==================================\n");
	printf("*(a[1]+1)=%d\n",*(a[1]+1));
	printf("==================================\n");
	printf("*(*(a+1)+1)=%d\n",*(*(a+1)+1));
	printf("==================================\n");
	printf("*(p+1*3+1)=%d\n",*(p+1*3+1));
	printf("==================================\n");
	printf("*(*(q+1)+1)=%d\n",*(*(q+1)+1));
	printf("==================================\n");
	printf("*(q[1]+1)=%d\n",*(q[1]+1));
	printf("==================================\n");
	printf("q[1][1]=%d\n",q[1][1]);
	printf("==================================\n");


	return 0;
}


    二维数组的数组名是指向数组第一行元素的数组指针

    访问二维数组第m行第n的方式:
        a[m][n]
        *(a[m]+n)
        *(*(a+m)+n)
        *(p+m*N+n)
        *(*(q+m)+n)
        *(q[m]+n)
        q[m][n]


    1,二维数组传参:

整形二维数组传参
        int a[2][3] = {0};
        int Fun(int (*parray)[3], int len);

具体可参考如下程序:

#include

int Inputa(int (*pa)[3],int len)
{
	int i = 0;
	int j = 0;

	for(j = 0;j < len;j++)
	{
		for(i = 0;i < 3;i++)
		{
			scanf("%d",&pa[j][i]);
		}
	}
	return 0;
}

int Avera(int (*pa)[3],int len)
{	
	double sum = 0;
	int i = 0;
	int j = 0;

	for(i = 0;i < len;i++)
	{
		for(j = 0;j < 3;j++)
		{
			sum += pa[i][j];
		}
	}
	printf("平均数为:%.2lf\n",sum / (3*len));

	return 0;
}

int Outputa(int (*pa)[3],int len)
{
	int i = 0;
	int j = 0;

	for(j = 0;j < len;j++)
	{
		for(i = 0;i < 3;i++)
		{
			printf("pa[%d][%d]=%d ",j,i,pa[j][i]);
		}
		printf("\n");
	}
	return 0;
}

int main(void)
{	
	int a[2][3] = {0};

	Inputa(a,2);
	Avera(a,2);
	Outputa(a,2);

	return 0;
}

字符型二维数组传参       

        char str[5][32] = {0};
        int Fun(char (*pstr)[32], int len);

具体可参考如下程序:

#include
#include
int Inputa(char (*pa)[32],int len)
{	
	int j = 0;

	for(j = 0;j < len;j++)
	{
		gets(pa[j]);
	}

	return 0;
}

int Outputa(char (*pa)[32],int len)
{
	int i = 0;
	for(i = 0;i < len;i++)
	{
		puts(pa[i]);
	}
	return 0;
}

int Sorta(char (*pa)[32],int len)
{	
	int i = 0;
	int j = 0;
	char tmp[32] = {0};

	for(j = 0;j < len - 1;j++)
	{
		for(i = 0;i < len - 1 - j;i++)
		{
			if(strcmp(pa[i],pa[i+1]) > 0)
			{
				strcpy(tmp,pa[i]);
				strcpy(pa[i],pa[i+1]);
				strcpy(pa[i+1],tmp);
			}
		}
	}

	return 0;
}

int main(void)
{	
	char a[5][32] = {0};

	Inputa(a,5);
	Sorta(a,5);
	Outputa(a,5);


	return 0;
}

3.二级指针:

                int **a = &b;

                int *b = &c;

                int c = 10;

 二级指针          存放一级指针地址     

 一级指针              存放数据地址

    数据                      存放数据  


    1.指针数组传参时 


        int *a[5] = {NULL};  
        a: int **

具体如下:

#include

int main(void)
{
	int num = 10;
	int *p = NULL;
	int **q = NULL;

	q = &p;
	p = #

	printf("===================\n");
	printf("**q = %d\n",**q);
	printf("===================\n");
	printf("*q = %p\n",*q);
	printf("*p = %d\n",*p);
	printf("===================\n");
	printf("q = %p\n",q);
	printf("p = %p\n",p);
	printf("num = %d\n",num);
	printf("===================\n");
	printf("&q = %p\n",&q);
	printf("&p = %p\n",&p);
	printf("&num = %p\n",&num);

	return 0;
}

        char *pstr[5] = {"hello", "world", "how", "are", "you"};
        int Fun(char **ppstr, int len);

具体可参考如下程序:

#include

int fun1(char **pstr,int len)
{
	int i = 0;

	for(i = 0;i < len;i++)
	{
		printf("pstr[i] = %s\n",pstr[i]);		
	}
	return 0;
}

int fun2(char (*pa)[32],int len)
{
	int i = 0;
	
	for(i = 0;i < len;i++)
	{
		printf("pa[i] = %s\n",pa[i]);
	}

	return 0;
}

int main(void)
{	
	char *pstr[5] = {"hello","world","how","are","you"};
	char a[5][32] = {"hello","world","how","are","you"};

	fun1(pstr,5);

	printf("========================\n");

	fun2(a,5);

	return 0;
}

作业:


    1.现有二维数组 char str[5][32] = {"hello", "world", "how", "are", "you"};
            封装函数实现对所有字符串的排序
            封装函数实现对所有字符串的打印

    2.现有指针数组 char *pstr[5] = {"hello", "world", "how", "are", "you"};
            封装函数实现对所有字符串的排序
            封装函数实现对所有字符串的打印 

1,

#include
#include

int Sortstr(char (*pstr)[32],int len)
{
	int i = 0;
	int j = 0;
	char tmp[32] = {0};

	for(j = 0;j < len - 1;j++)
	{
		for(i = 0;i < len - 1 - j;i++)
		{
			if(strcmp(pstr[i],pstr[i+1]) > 0)
			{
				strcpy(tmp,pstr[i]);
				strcpy(pstr[i],pstr[i+1]);
				strcpy(pstr[i+1],tmp);
			}
		}
	}
	return 0;
}


int Putstr(char (*pstr)[32],int len)
{
	int i = 0;

	for(i = 0;i < len; i++)
	{
		printf("pstr[%d]=%s\n",i,pstr[i]);
	}
	return 0;
}


int main(void)
{
	char str[5][32] = {"hello","world","how","are","you"};

	Sortstr(str,5);

	Putstr(str,5);

	return 0;
}

2,

#include
#include

int Sortstr(char **pstr,int len)
{
	int i = 0;
	int j = 0;
	char *ptmp = NULL;

	for(j = 0;j < len -1;j++)
	{
		for(i = 0;i < len - 1 - j;i++)
		{
			if(strcmp(pstr[i],pstr[i+1]) > 0)
			{
				ptmp = pstr[i];
				pstr[i] = pstr[i+1];
				pstr[i+1] = ptmp;
			}
		}
	}
	return 0;
}


int Putstr(char **pstr,int len)
{
	int i = 0;

	for(i = 0;i < len;i++)
	{
		printf("pstr[%d]=%s\n",i,pstr[i]);
	}
	return 0;
}


int main(void)
{
	char *pstr[5] = {"hello","world","how","are","you"};

	Sortstr(pstr,5);

	Putstr(pstr,5);

	return 0;
}


 

你可能感兴趣的:(学习,c语言,linux,嵌入式硬件)