文章目录
指针(续上)
3.二维数组的传参
int a[2][3] = {1,2,3,4,5,6};
fun(a,2);
int fun(int (*p)[3],int len);
4.指针数组的传参
char *pstr[5] = {NULL}
int fun(char **ppstr,int len);
13.void *指针
主要用于保存内存地址
多用于函数传参和返回值,统一参数和返回值类型
void*转换为char*,int*,double*不要类型转换,可以直接赋值
char*,int*,double*转换为void*类型时,需要强制类型转换
构造数据类型
1.结构体
1.类型定义
struct 结构体名{
数据类型1 成员变量1;
数据类型2 成员变量2;
......
};
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"},
.age = 18,
}; //未初始化的元素被赋值为0
4.结构体成员访问
.:结构体变量类型访问成员变量
->:结构体指针类型访问成员变量
结构体访问成员变量最终的类型由成员变量的类型决定
5.结构体的存储
内存对齐:
- 结构体成员必须存放在内存地址为自身类型长度整数倍的内存单元中
- 结构体的大小必须为自身最大类型长度的整数倍
6.结构体传参
1.传值
void fun(struct student tmp);
2.传地址
void fun(struct student *ptmp);
习题
1.定义一个结构体包含年月日信息,封装一个函数从终端接收年月日,封装一个函数判断年份是否为闰年,封装一个函数获得该天为该年的第几天,封装一个函数获得剩余天数
代码实现:
#include<stdio.h>
#include<string.h>
struct date {
int year;
int month;
int day;
};
void getdate(struct date *pret) {
scanf("%04d", &pret->year);
scanf("%02d", &pret->month);
scanf("%02d", &pret->day);
return;
}
int isleepyear(int year) {
if (year % 400 == 0) {
return 1;
}
else if (year % 4 == 0 && year % 100 != 0) {
return 1;
}
else {
return 0;
}
}
int getfinday(struct date* pdate,int *pret) {
for (int i = 1; i < pdate->month;i++) {
if (i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12) {
*pret += 31;
}
else if (i == 4 || i == 6 || i == 9 || i == 11) {
*pret += 30;
}
else {
if (isleepyear(pdate->year)) {
*pret += 29;
}
else {
*pret += 28;
}
}
}
*pret += pdate->day;
return 0;
}
int getendday(struct date* pret,int ret, int* pendday) {
if (isleepyear) {
*pendday = 366 - ret;
}
else {
*pendday = 365 - ret;
}
}
int main(void) {
struct date a;
int ret = 0;
int endday = 0;
memset(&a, 0, sizeof(a));
getdate(&a);
if (isleepyear(a.year)) {
printf("是闰年\n");
}
else {
printf("不是闰年\n");
}
getfinday(&a,&ret);
printf("该天为%d年的第%d天\n",a.year, ret);
getendday(&a, ret,&endday);
printf("%d年剩余%d天\n",a.year, endday);
return 0;
}
2.从终端接收一个字符串,完成单词倒置
代码实现:
#include <stdio.h>
#include <string.h>
void inputarray(char (*p)[32], int len) {
for (int i = 0; i < len; i++) {
scanf("%s", p[i]);
}
}
int swaparray(char (*p)[32], int len) {
char tmp[32] = { 0 };
for (int i = 0; i < len / 2; i++) {
strcpy(tmp, p[i]);
strcpy(p[i], p[len - 1 - i]);
strcpy(p[len - 1 - i], tmp);
}
return 0;
}
void outputarray(char (*p)[32], int len) {
for (int i = 0; i < 5; i++) {
printf("%s ", p[i]);
}
printf("\n");
}
int main(void) {
char str[5][32] = { 0 };
char* pstr[5] = { str[0],str[1],str[2],str[3],str[4] };
inputarray(str, 5);
swaparray(str, 5);
outputarray(str, 5);
return 0;
}
= 0; i < 5; i++) {
printf("%s ", p[i]);
}
printf("\n");
}
int main(void) {
char str[5][32] = { 0 };
char* pstr[5] = { str[0],str[1],str[2],str[3],str[4] };
inputarray(str, 5);
swaparray(str, 5);
outputarray(str, 5);
return 0;
}