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

目录

指针

1.const指针

     2.void

3.函数指针和指针函数:

    1.指针函数:

    2.函数指针:

    4.C语言中二级指针使用场景:

    1.指针数组传参时:

    2.函数体内想修改函数体外指针变量值的时

构造数据类型:   

数据类型:       

1.基本数据类型:         

           1, int 

            2,double 

            3,char 

            4,等等

  2.构造数据类型:         

    1.struct 结构体         

    2.union 共用体       

    3.enum  枚举

1.结构体:   

1.结构体类型的定义     

    2.结构体变量的定义     

    3.结构体变量的初始化:

        1.全部初始化:

        2.局部初始化:

    4.结构体成员变量的访问:

作业:


指针

1.const指针

定义形式:
    const 关键字   常量(只读)   readonly 

    1.const int *p;
    2.int const *p;
    3.int *const p;
    4.const int *const p;
    5.int const *const p;

    1和2是等价的
    const修饰 *p,指针变量p的值可以改变,但不能利用指针修改指向空间中的值

    3
    const修饰 p,指针变量p的值不能改变,但可以利用指针变量p修改指向空间中的值
    一定要对指针初始化

    4和5是等价的
    const修饰p和*p,指针变量p的值不能改变,也不能利用*p改变直系那个空间中的值
    一定要初始化  

参考如下:

#include

int main(void)
{
	const int *p = NULL;
	int const *q = NULL;
	int a = 300;
	int *const m = &a;
	const char *const n = "how";
	char const *const v = "are";
	

	p = &a;
	q = &a;

	printf("*P = %d *q = %d\n",*p,*q);
	printf("*m = %d\n",*m);
	
	*m = 200;

	printf("*P = %d *q = %d\n",*p,*q);
	printf("*m = %d\n",*m);
	

	return 0;
}


    
 2.void


    void a;

    高精度
    int *p;
    double *p;
    char *p;

    低精度
    void *p;
    p保存内存地址

    int *、double *、char * 转换为 void * 需要强制类型转换
    void *转换为int *、double *、char *不需要强制类型转换

    strcpy -> 拷贝字符串
    memcpy -> 拷贝一段内存空间

参考如下:

#include

char *fun(void)
{
	char *str = {"hello world"};
//	char str[32] = {"hello world"};
	return str;
}



int main(void)
{
	char *p = NULL;

	p = fun();

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

	return 0;
}

3.函数指针和指针函数:


    指针函数:是函数,函数的返回值类型是指针类型
    函数指针:是指针,指针指向了函数

    1.指针函数:


        局部变量的地址不能返回,因为局部变量会随函数作用域结束被回收,虽然能够获得返回的地址,但地址对应的空间已经被回收过了

        将函数的返回值作为下一个函数的参数

参考如下:

#include
#include

char *fun(char *p,const char *q)
{
	char *o = p;

	while(*q != '\0')
	{
		*p = *q;
		p++;
		q++;
	}
	*p = '\0';

	return o;
}


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

	fun(str2,fun(str1,"hello world"));
	printf("str1 = %s str2 = %s\n",str1,str2);

	strcpy(str2,strcpy(str1,"how are you"));
	printf("str1 = %s str2 = %s\n",str1,str2);

	return 0;
}

    2.函数指针:

        定义形式:

        int (*Fun)(int a, int b) = NULL;


        定义函数指针变量Fun,占8个字节空间,指向int返回值有2个int参数的函数

参考如下:    

#include
#include

#define N jjiang

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

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

int Sorta(int *pa,int len,int (*pcmp)(int ,int ))
{
	int i = 0;
	int j = 0;
	int tmp = 0;
	for(j = 0;j < len -1;j++)
	{
		for(i = 0;i < len - 1 - j;i++)
		{
			if(pcmp(pa[i],pa[i+1]))
			{
				tmp = pa[i];
				pa[i] = pa[i+1];
				pa[i+1] = tmp;
			}
		}
	}
	return 0;
}

int sheng(int num1,int num2)
{
	if(num1 > num2)
	{
		return 1;
	}

	return 0;
}

int jiang(int num1,int num2)
{
	if(num2 > num1)
	{
		return 1;
	}

	return 0;
}

int jsheng(int num1,int num2)
{
	if(abs(num1) > abs(num2))
	{
		return 1;
	}
	return 0;
}

int jjiang(int num1,int num2)
{
	if(abs(num2) > abs(num1))
	{
		return 1;
	}
	return 0;
}


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

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

	return 0;
}


4.C语言中二级指针使用场景:


    1.指针数组传参时:

        定义形式:
        char *str[5];

        int Fun(char **ppstr, int len);

    2.函数体内想修改函数体外指针变量值的时

        要传递指针变量的地址即二级指针


        char *p = NULL;

        int Fun(char **pp);

参考如下:

#include

void fun(char **p)
{
	*p = "hello world!";

	return;
}


int main(void)
{
	char *p = NULL;

	fun(&p);

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

}

==================================================================================================================================================

构造数据类型:
   

数据类型:
       

1.基本数据类型:
         

           1, int 

            2,double 

            3,char 
            4,等等

     

  2.构造数据类型:
         

    1.struct 结构体
         
    2.union 共用体
       
    3.enum  枚举

1.结构体:
   

1.结构体类型的定义
     

  struct 结构体名 
        {
            数据类型1 成员变量1;
            数据类型2 成员变量2;
            数据类型3 成员变量3;
            ..
        };

    2.结构体变量的定义
     

         数据类型 变量名;
         数据类型 *指针变量名;

    3.结构体变量的初始化:


        1.全部初始化:


            struct student s = {"zhangsan", 'm', 19, 100};

        2.局部初始化:


            struct student stu = {
                .name = "lisi",
                .score = 90,
            };  

参考如下:

#include

struct time
{
	int hour;
	int min;
	int sec;
};

struct date
{
	int year;
	int mon;
	int day;
};

struct datetime 
{
	struct time t;
	struct date d;
};

struct yusuan
{
	int jia;
	int jian;
	int cheng;
	int chu;
}ys;


int main(void)
{
	struct yusuan ys = {1,2,3,4};	
	struct datetime dt = {{15,54,30},{2024,1,29}};
	struct date da = {
						.year = 2024,
						.mon = 1,
					};
	struct datetime *p = NULL;
	struct time ti = {16,33,10};

	p = &dt;

	printf("%d:%d:%d\n",ti.hour,ti.min,ti.sec);

	printf("%d-%d-%d-%d:%d:%d\n",dt.d.year,dt.d.mon,dt.d.day,dt.t.hour,dt.t.min,dt.t.sec);

	printf("%d----%d\n",p->d.year,p->t.hour);

	return 0;
}

    4.结构体成员变量的访问:


         .  :结构体变量类型访问成员变量使用 .
        ->  :结构体指针类型访问成员变量使用 -> 

        整体类型由成员变量类型决定

参考如下:

#include
#include

struct stduent
{
	char name[32];
	char sex;
	int age;
	int score;
};


int main(void)
{
	struct stduent s;

	memset(&s,0,sizeof(s));

	gets(s.name);

	s.sex = getchar();

	scanf("%d%d",&s.age,&s.score);

	printf("姓名:%s\n性别:%c\n年龄:%d\n成绩:%d\n",s.name,s.sex,s.age,s.score);

	return 0;
}


作业:


    1.定义一个结构体包含年-月-日三个成员
        struct date 
        {
            int year;
            int mon;
            int day;
        };
        从终端接收年月日信息存放到结构体中,计算该天为该年的第几天?计算该年剩余多少天?打印年月日信息
    
    2.封装一个函数,给定一个数字字符串转换成其对应的整形数
        "123456"
        123456 

        int MyAtoi(char *pstr);

1,

#include
#include


struct date
{
	int year;
	int mon;
	int day;
};

int main(void)
{
	int panduan = 0;
	int sum = 0;
	int last = 0;
	int i = 0;
	int a[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
	struct date d;
	memset(&d,0,sizeof(d));

	scanf("%d%d%d",&d.year,&d.mon,&d.day);

	if(d.year % 4 == 0 && d.year % 100 != 0 || d.year % 400 == 0)
	{
		panduan = 1;
	}

	if(panduan == 1)
	{
		a[2] = 29;
	}
	
	for(i = 0;i < d.mon;i++)
	{
		sum += a[i];
	}
	sum += d.day;

	last = 356 - sum;

	if(panduan == 1)
	{
		last = 366 - sum;
	}

	printf("%d-%d-%d为该年第%d天,该年还剩%d天\n",d.year,d.mon,d.day,sum,last);

	return 0;
}

2,

#include
#include

int MyAtoi(char *pa)
{
	int sum = 0;
	int len = strlen(pa);
	while(*pa != '\0')
	{
		sum = sum * 10 + (*pa - 48);
		pa++;
	}
	return sum;
}


int main(void)
{
	char a[64] = {0};
	int b = 0;

	gets(a);

	b = MyAtoi(a);

	printf("%d\n",b);

	return 0;
}

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