当前位置: 首页 > news >正文

Linux学习--C语言(指针4、结构体)

1.二维数组的传参

int a[2][3] = {1, 2, 3, 4, 5, 6};fun(a,2);
int fun(int (*p)[3], int len);

 2.指针数组的传参

char *pastr[5] = {NULL};int fun(char **pstr,int len);

例子:

#include <stdio.h>
#include <string.h>int InputArray(char (*p)[32], int len)
{int i = 0;for(i = 0; i < len; i++){gets(p[i]);}return 0;
}int SortArray(char **ppstr, 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(ppstr[i], ppstr[i+1]) > 0){ptmp = ppstr[i];ppstr[i] = ppstr[i+1];ppstr[i+1] = ptmp;}}}return 0;
}int OutputArray1(char **ppstr, int len)
{int i = 0;for(i = 0; i < len; i++){printf("%s\n",ppstr[i]);}return 0;
}int OutputArray2(char (*p)[32], int len)
{int i = 0;for(i = 0; i < len; i++){printf("%s\n",p[i]);}return 0;
}
int main(void)
{char str[5][32] = {0};char *pstr[5] = {str[0], str[1], str[2], str[3], str[4]};InputArray(str,5);SortArray(pstr,5);OutputArray1(pstr,5);OutputArray2(str,5);return 0;
}

3.void *指针

  •  void *指针主要用来保存内存地址
  • void *转换为char *、 int *、 double *类型时,不需要类型转换,直接赋值就行
  • char *、 int *、 double *转换转换为void *类型时,需要强制类型转换
  • void *多用于函数参数和返回值,统一参数和返回值类型
void *p;
char *a;
int *b;
double *c;a = p;
p = (void *)a;

4.构造数据类型

4.1 结构体

1.类型定义:

struct 结构体名 {数据类型1 成员变量1;数据类型2 成员变量2;数据类型3 成员变量3;...
};struct date{int year;int mon;int day;
};struct student{char name[32];char sex;int age;int score;
};

2.结构体变量定义

存储类型 数据类型 变量名;

3.结构体元素初始化

1.全部初始化

struct student stu = {"zhangsan", 'm', 18, 90};

2.局部初始化

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

4.结构体成员的访问

.  :结构体变量类型访问成员变量  .
-> :结构体指针类型访问成员变量 ->结构体访问成员变量最终的类型由成员类型变量决定
#include <stdio.h>struct date{int year;int mon;int day;
};struct time{int hour;int min;int sec;
};struct datetime{struct date d;struct time t;
};struct student{char name[32];char m;int age;int score;
};int main(void)
{struct datetime dt = {{2025, 7, 29},{15, 11, 20},};struct datetime dt2 = {.d = {2025, 6, 29},.t = {11 , 11},};struct student stu1 = {"zhangsan", 'm', 12, 98};struct student stu2 = {"lisi", 'm', 11, 85};struct student *pstu2 = NULL;pstu2 = &stu2;struct datetime *pdt = NULL;pdt = &dt;printf("%04d.%02d.%02d\n", dt.d.year, dt.d.mon, dt.d.day);printf("%02d:%02d:%02d\n", dt.t.hour, dt.t.min, dt.t.sec);printf("%04d.%02d.%02d %02d:%02d:%02d\n",pdt->d.year, pdt->d.mon, pdt->d.day, pdt->t.hour, pdt->t.min, pdt->t.sec);printf("姓名:%s\n", stu1.name);printf("性别:%c\n", stu1.m);printf("年龄:%d\n", stu1.age);printf("分数:%d\n", stu1.score);printf("=================================\n");printf("姓名:%s\n", pstu2->name);printf("性别:%c\n", pstu2->m);printf("年龄:%d\n", pstu2->age);printf("分数:%d\n", pstu2->score);return 0;
}

5.结构体的存储

  • 结构体成员必须存放在内存地址为自身类型长度整数倍的内存单元中
  • 结构体大小必须为自身最大类型长度的整数倍
struct student{char name[32];char sex;int age;int score;
};  //44个字节

6.结构体的传参

传地址更好,因为实参将8字节拷贝给形参,避免大结构体大空间的拷贝

  • 传值
void fun(struct student tmp);
  • 传地址
void fun(struct student *ptmp);

作业

1.定义结构体包含年月日信息,封装一个函数从终端接收年月日,封装一个函数判断年份是否为闰年,封装一个函数获得该天为该年第几天,封装一个函数获得剩余天数

2.从终端接收一个字符串,完成单词倒置

"how are you" -> "uoy era woh" -> "you era woh" -> "you are woh" -> "you are how"

#include <stdio.h>struct date{int year;int mon;int day;
};void InputDate(struct date *pret)
{scanf("%d%d%d",&pret->year, &pret->mon, &pret->day);return;
}int IsLeepyear(int year)
{if((year % 4 == 0 && year % 100 !=0) || (year & 400 == 0)){return 1;}else{return 0;}
}int WhatDay(struct date ret)
{int sum = 0;switch(ret.mon){case 1:sum = 0;break;case 2:sum = 31;break;case 3:sum = 59;break;case 4:sum = 90;break;case 5:sum = 120;break;case 6:sum = 151;break;case 7:sum = 181;break;case 8:sum = 212;break;case 9:sum = 243;break;case 10:sum = 273;break;case 11:sum = 304;break;case 12:sum = 334;break;}if(IsLeepyear(ret.year) && ret.mon > 2){return sum + ret.day + 1;}else{return sum + ret.day;}
}int ReDay(struct date ret)
{if(IsLeepyear(ret.year)){return 366-WhatDay(ret);}else{return 365-WhatDay(ret);}
}int main(void)
{struct date d;InputDate(&d);IsLeepyear(d.year) ? printf("%d是闰年\n",d.year) : printf("%d不是闰年\n",d.year);printf("是该年第%d天\n",WhatDay(d));printf("剩余天数:%d\n",ReDay(d));return 0;
}
#include <stdio.h>void InputArray(char *pstr)
{gets(pstr);return;
}void SortArray(char *pstr)
{char tmp = 0;char *phead = pstr;char *ptail = pstr;char *ptmp = NULL;while(*ptail != '\0'){		ptail++;}ptail--;while(phead < ptail){tmp = *phead;*phead = *ptail;*ptail = tmp;phead++;ptail--;}printf("%s\n",pstr);phead = ptail = pstr;while(1){while(*ptail != ' '){if(*ptail == '\0'){break;}ptail++;}ptmp = ptail;ptail -= 1;while(phead < ptail){tmp = *phead;*phead = *ptail;*ptail = tmp;phead++;ptail--;}printf("%s\n",pstr);if(*ptmp == '\0'){break;}ptail = phead = ptmp+1;}return;
}int main(void)
{char a[100] = {0};char *p = a;InputArray(p);SortArray(p);return 0;
}
http://www.lryc.cn/news/604129.html

相关文章:

  • 【Spring】日志级别的分类和使用
  • Qt小技巧 QStandardPaths详解
  • C语言14-指针4-二维数组传参、指针数组传参、viod*指针
  • JAVA_TWENTY—ONE_单元测试+注解+反射
  • 在 Cloudflare 平台上完整部署 GitHub 项目 MoonTV 实现免费追剧流程
  • vite + chalk打印输出彩色命令行
  • 并查集介绍及典型应用和编程题
  • Python爬虫01_Requests第一血获取响应数据
  • __getattr__和 __getattribute__ 的用法
  • Docker学习相关视频笔记(二)
  • linux内核报错汇编分析
  • 云原生周刊:2025年的服务网格
  • JSON-RPC 2.0 规范
  • fastjson反序列化时_id的处理
  • WebRTC 2025全解析:从技术原理到商业落地
  • MC0241防火墙
  • 16大工程项目管理系统对比:开源与付费版本
  • 牛客网之华为机试题:密码验证程序
  • python-网络编程
  • Qt 移动应用性能优化策略
  • 板凳-------Mysql cookbook学习 (十二--------7)
  • Android User版本默认用test-keys,如何改用release-keys
  • 北方公司面试记录
  • 前端数据库:IndexedDB从基础到高级使用指南
  • 基于Prophet、滑动平均、加权平均的地铁客流量预测与可视化系统的设计与实现
  • Java【代码 17】httpclient PoolingHttpClientConnectionManager 连接池使用举例
  • 无穿戴动作捕捉技术:驱动历史活化、乐园叙事与教育沉浸的文旅利器
  • [Linux入门] Linux 部署本地 APT 仓库及 NFS 共享服务全攻略
  • 算法精讲:二分查找(一)—— 基础原理与实现
  • 7.28学习日志