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;
}