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.pswp.cn/web/91083.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/91083.shtml
英文地址,請注明出處:http://en.pswp.cn/web/91083.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【STM32】FreeRTOS 消息隊列(五)

在 FreeRTOS 中&#xff0c;任務消息隊列&#xff08;Message Queue&#xff09; 是一種非常關鍵的通信機制&#xff0c;用于在任務之間 傳遞數據、同步事件。 它是實現任務 解耦、異步通信 的核心工具之一&#xff0c;FreeRTOS 的消息隊列是任務之間通信的橋梁。 簡單點說&am…

【筆記】加速 uv 安裝:系統環境變量配置國內鏡像源

使用 Conda 工具鏈創建 UV 本地虛擬環境全記錄——基于《Python 多版本與開發環境治理架構設計》-CSDN博客 命令行創建 UV 環境及本地化實戰演示—— 基于《Python 多版本與開發環境治理架構設計》的最佳實踐-CSDN博客 加速 uv 包安裝&#xff1a;Windows 系統環境變量配置國內…

Three.js 渲染優化處理

基于項目經驗和最佳實踐&#xff0c;以下是渲染優化的具體處理方法&#xff1a; 1. 幾何體與材質優化 使用 BufferGeometry // 推薦&#xff1a;使用 BufferGeometry 替代 Geometry const geometry new THREE.BufferGeometry();合并幾何體 // 將多個幾何體合并為一個以減少繪制…

Kafka——Kafka控制器

引言在Kafka集群中&#xff0c;有一個組件堪稱"隱形的指揮官"——它默默協調著Broker的加入與退出&#xff0c;管理著主題的創建與刪除&#xff0c;掌控著分區領導者的選舉&#xff0c;它就是控制器&#xff08;Controller&#xff09;。想象一個擁有100臺Broker的大…

編程與數學 03-002 計算機網絡 11_域名系統(DNS)

編程與數學 03-002 計算機網絡 11_域名系統&#xff08;DNS&#xff09;一、DNS的作用與功能&#xff08;一&#xff09;域名與IP地址的映射關系&#xff08;二&#xff09;DNS的層次結構二、DNS查詢過程&#xff08;一&#xff09;遞歸查詢與迭代查詢&#xff08;二&#xff0…

影翎Antigravity將發布全球首款全景無人機,8月開啟公測招募

7月28日&#xff0c;消費級無人機品牌「影翎Antigravity」及品牌標識官宣亮相&#xff0c;計劃推出全新品類——全球首款「全景無人機」。這一消息引發行業震動&#xff0c;消費級航拍無人機市場或將迎來顛覆性飛行體驗。影翎Antigravity官方介紹&#xff0c;引力不僅是束縛雙腳…

SpringBoot集成Quzrtz實現定時任務

一 定時任務介紹 自律是很多人都想擁有的一種能力&#xff0c;或者說素質&#xff0c;但是理想往往很美好&#xff0c;現實卻是無比殘酷的。在現實生活中&#xff0c;我們很難做到自律&#xff0c;或者說做到持續自律。例如&#xff0c;我們經常會做各種學習計劃、儲蓄計劃或減…

Java中的異常判斷以及文件中的常用方法及功能

目錄 異常 作用 異常的處理方式 JVM&#xff08;虛擬機&#xff09;默認的處理方式 自己處理&#xff08;捕獲異常&#xff09; 拋出異常&#xff08;也就是交給調用者處理&#xff09; 自定義異常 file File中常見成員方法 判斷和獲取 創建和刪除 獲取并遍歷 異常…

【C++算法】74.優先級隊列_最后一塊石頭的重量

文章目錄題目鏈接&#xff1a;題目描述&#xff1a;解法C 算法代碼&#xff1a;題目鏈接&#xff1a; 1046. 最后一塊石頭的重量 題目描述&#xff1a; 解法 每次取出最重的兩塊石頭進行碰撞&#xff0c;將剩余的石頭重新放入堆中。 C 算法代碼&#xff1a; class Solution …

中興云電腦W101D2-晶晨S905L3A-2G+8G-安卓9-線刷固件包

中興云電腦W101D2-晶晨S905L3A-2G8G-WIFI-藍牙5.0-3個USB2.0-線刷包線刷方法&#xff1a;1、準備好一根雙公頭USB線刷刷機線&#xff0c;長度30-50CM長度最佳&#xff0c;同時準備一臺電腦&#xff1b;2、電腦上安裝好刷機工具Amlogic USB Burning Tool 軟件 →打開軟件 →文件…

Android OkHttp 底層原理和實戰完全教程(責任鏈模式詳解)

目錄 1. OkHttp 入門:從一個請求開始 1.1 基本 GET 請求:三步走 1.2 同步 vs 異步:選擇你的風格 1.3 為什么選 OkHttp? 2. 配置 OkHttpClient:打造你的專屬網絡引擎 2.1 超時設置:別讓請求卡死 2.2 添加攔截器:窺探請求全過程 2.3 緩存:讓請求更快更省流量 3. …

【RK3588部署yolo】算法篇

簡歷描述收集并制作軍事偽裝目標數據集&#xff0c;包含真實與偽裝各種類型軍事目標共計60余類。其中&#xff0c;包含最新戰場充氣偽裝軍事裝備30余類&#xff0c;并為每一張圖片制作了詳細的標注。針對軍事偽裝目標的特點&#xff0c;在YOLOv8的Backbone與Neck部分分別加…

【Spring Boot 快速入門】一、入門

目錄Spring Boot 簡介Web 入門Spring Boot 快速入門HTTP 協議概述請求協議響應協議解析協議TomcatSpring Boot 簡介 Spring Boot 是由 Pivotal 團隊&#xff08;后被 VMware 收購&#xff09;開發的基于 Spring 框架的開源項目&#xff0c;于 2014 年首次發布。其核心目標是簡…

如何調整服務器的內核參數?-哈爾濱云前沿

調整服務器內核參數是一項較為專業的操作&#xff0c;不同的操作系統調整方式略有不同&#xff0c;以下以常見的 Linux 系統為例&#xff0c;介紹一些調整服務器內核參數的一般步驟和常用參數&#xff1a;一般步驟 備份當前配置&#xff1a;在修改內核參數之前&#xff0c;先備…

C++基礎:模擬實現queue和stack。底層:適配器

引言模擬實現queue和stack&#xff0c;理解適配器&#xff0c;實現起來非常簡單。一、適配器 適配器是一種能讓原本不兼容的接口協同工作的設計模式或者組件。它的主要作用是對一個類的接口進行轉換&#xff0c;使其符合另一個類的期望接口&#xff0c;進而實現適配和復用。&am…

OI 雜題

OI 雜題字符串括號匹配例 1&#xff1a;與之前的類似&#xff0c;就是講一點技巧&#xff0c;但是比較亂&#xff0c;湊合著看吧。 字符串 括號匹配 幾何意義&#xff1a;考慮令 ( 為 111 變換&#xff0c;令 ) 為 ?1-1?1 變換&#xff0c;然后對這個 1/?11/-11/?1 構成…

【論文閱讀】Safety Alignment Should Be Made More Than Just a Few Tokens Deep

Safety Alignment Should Be Made More Than Just a Few Tokens Deep原文摘要問題提出現狀與漏洞&#xff1a;當前LLMs的安全對齊機制容易被攻破&#xff0c;即使是簡單的攻擊&#xff08;如對抗性后綴攻擊&#xff09;或良性的微調也可能導致模型越獄。核心論點&#xff1a; 作…

Generative AI in Game Development

如有侵權或其他問題&#xff0c;歡迎留言聯系更正或刪除。 出處&#xff1a;CHI 20241. 一段話總結本研究通過對來自 Reddit 和 Facebook 群組的 3,091 條獨立游戲開發者的在線帖子和評論進行定性分析&#xff0c;探討了他們對生成式 AI在游戲開發中多方面作用的認知與設想。研…

【C++算法】72.隊列+寬搜_二叉樹的最大寬度

文章目錄題目鏈接&#xff1a;題目描述&#xff1a;解法C 算法代碼&#xff1a;題目鏈接&#xff1a; 662. 二叉樹最大寬度 題目描述&#xff1a; 解法 這里的寬度指的是一層的最右邊的非空節點到一層的最左邊的非空節點&#xff0c;一共的節點數。 解法一&#xff1a;硬來&am…

什么是3DVR?VR技術有哪些應用場景?

VR與3D技術解析及應用在高科技領域&#xff0c;VR和3D是兩個常被提及的名詞。那么&#xff0c;這兩者之間究竟存在著怎樣的區別與聯系呢&#xff1f;簡而來說&#xff0c;VR技術是3D技術的一種高級延展和深化應用。3D技術&#xff0c;即將二維設計圖轉化為立體、逼真的視覺效果…