初階C語言-結構體

在這里插入圖片描述

🌞 “少年有夢不至于心動,更要付諸行動。” 今天我們一起學習一下結構體的相關內容!

結構體

  • 🎈1.結構體的聲明
    • 1.1結構的基礎知識
    • 1.2結構的聲明
    • 1.3結構成員的類型
    • 1.4結構體變量的定義和初始化
  • 🎈2.結構體成員的訪問
    • 2.1結構體變量訪問成員
    • 2.2結構體指針訪問指向變量的成員
  • 🎈3.結構體傳參

🎈1.結構體的聲明

1.1結構的基礎知識

📖結構是一些值的集合,這些值稱為成員變量,結構的每個成員可以是不同類型的變量。

1.2結構的聲明

📝為什么會出現結構體呢?在我們當前的一些學習中,我們學過的類型都是內置類型,例如:char short int double 等等。但是,它們無法描述一個復雜的對象,比方說人,我們很難用一個類型描述出它。相反,我們可能需要通過性別、年齡、身高、體重等等來進行描述。
🧩對于結構體的聲明,格式如下:

struct tag
{member-list;//成員變量的列表
}variable-list;//變量列表

📖下面,給出一個學生的結構體的聲明:

struct Stu//struct是結構體的關鍵字
{//學生的相關屬性char name[20];//姓名int age;//年齡char sex[5];//性別char tele[12];//電話
}s3,s4;
//s3,s4是結構體類型的變量,但是s3,s4是全局變量。
int main()
{struct Stu s1;struct Stu s2;//s1,s2也是結構體類型的變量,但是是局部變量return 0;
}

在這里插入圖片描述
🔎這里的話,可能有的同學在想,如果每次在主函數內來定義一個結構體變量都要加struct Stu是不是太麻煩了,能不能把這個去掉呢,或者說有沒有更簡單的表達方法呢?我們這個時候,就需要用到typedef(typedef顧名思義是類型定義的,這里理解為類型重命名。鏈接: 關于關鍵字講解的鏈接)那么,程序可以做以下修改:

typedef struct Stu//struct是結構體的關鍵字
{//學生的相關屬性char name[20];//姓名int age;//年齡char sex[5];//性別char tele[12];//電話
}Stu;//Stu是重命名產生的新的類型
int main()
{Stu s1;Stu s2;//s1,s2是結構體類型的變量return 0;
}

1.3結構成員的類型

📖結構體成員的類型可以是標量、數組、指針,甚至是其他結構體。

struct B
{int a;short b;
};
struct C
{char c;int num;int arr[10];double* p;struct B b;struct B* p;
};

1.4結構體變量的定義和初始化

🧩結構體變量的定義:

struct A
{int age;char sex;
}a1;//a1是全局變量
struct A a2;//a2也是全局變量
int main()
{struct A a3;//局部變量return 0;
}

📖當我們想要給這些變量一些值的時候,我們就需要對變量進行初始化:

struct A
{int age;char sex;int arr[10];
}a1;//a1是全局變量
struct A a2;//a2也是全局變量
int main()
{//對于結構體的初始化可以用一對大括號來進行//按照順序初始化struct A a3 = { 18,'M',{1,2,3,4,5,6,7,8,9,10} };//局部變量//給指定的成員初始化struct A a4 = { .age = 20,.arr = {6,6,6} };return 0;
}

🔎我們可以通過監視來看看變量初始化的情況:
在這里插入圖片描述

🎈2.結構體成員的訪問

2.1結構體變量訪問成員

📖結構變量的成員通過點操作符(.)訪問的,點操作符要接受兩個操作數。

下面我們給出示例,帶大家了解一下:

#include <stdio.h>
#include <string.h>
struct A
{char name[20];int age;char sex;
};
void Set_a(struct A t)
{t.age = 10;//t.name = "zhangsan";//這里我們發現會報錯,因為name是數組名,數組是常量的地址,不能改變,這里我們就需要用到strcpy函數來進行拷貝strcpy(t.name, "zhangsan");//字符串拷貝t.sex = 'M';
}
int main()
{struct A a = { 0 };//寫一個函數給a中存放數據Set_a(a);return 0;
}

🔎我們上面這段代碼對不對呢?變量a是否被初始化了呢?這里,我們調試著看一看:
在這里插入圖片描述
🧩我們發現a并沒有被初始化,這是為什么呢?

?注意:實參傳遞給形參的時候,形參是實參的一份臨時拷貝,對形參的修改不會影響實參?

🎈通過前面的學習,我們知道這里應該通過傳地址的方式來改變實參的值:

#include <stdio.h>
#include <string.h>///strcpy函數的頭文件
struct A
{char name[20];int age;char sex;
};
void Set_a(struct A *t)
{(*t).age = 10;//t.name = "zhangsan";//這里我們發現會報錯,因為name是數組名,數組是常量的地址,不能改變,這里我們就需要用到strcpy函數來進行拷貝strcpy((*t).name, "zhangsan");//字符串拷貝(*t).sex = 'M';
}
int main()
{struct A a = { 0 };//寫一個函數給a中存放數據Set_a(&a);return 0;
}

在這里插入圖片描述
🌞同樣的,既然這里我們用到了指針,不妨可以用指針訪問指向變量的成員!

2.2結構體指針訪問指向變量的成員

📖通過結構體指針來訪問成員可以通過操作符->來實現。

🧩上述代碼可以做以下修改,結果相同:

#include <stdio.h>
#include <string.h>
struct A
{char name[20];int age;char sex;
};
void Set_a(struct A* t)
{t->age = 10;strcpy(t->name, "zhangsan");//字符串拷貝t->sex = 'M';
}
int main()
{struct A a = { 0 };//寫一個函數給a中存放數據Set_a(&a);return 0;
}

在這里插入圖片描述

🎈3.結構體傳參

#include <stdio.h>
struct B
{int date[100];int num;
};
struct B b = { {1,2,3},12 };
void Print1(struct B b)
{printf("%d\n", b.num);
}
void Print2(struct B *b)
{printf("%d\n", b->num);
}
int main()
{Print1(b);Print2(&b);return 0;
}

在這里插入圖片描述

🔎對于上面兩個函數Print1和Print2,用哪個更好呢?這里我們選擇函數Print2
?注:函數傳參的時候,參數是需要壓棧的?如果傳遞一個結構體對象的時候,結構體過大,參數壓棧的系統開銷比較大,所以會導致性能的下降!
??結論:結構體傳參的時候,要傳結構體的地址!

好啦,關于結構體的知識點到這里就結束啦,后期會繼續更新C語言的相關知識,歡迎大家持續關注、點贊和評論!??????

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/42244.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42244.shtml
英文地址,請注明出處:http://en.pswp.cn/news/42244.shtml

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

相關文章

自然語言處理從入門到應用——LangChain:記憶(Memory)-[自定義對話記憶與自定義記憶類]

分類目錄&#xff1a;《自然語言處理從入門到應用》總目錄 自定義對話記憶 本節介紹了幾種自定義對話記憶的方法&#xff1a; from langchain.llms import OpenAI from langchain.chains import ConversationChain from langchain.memory import ConversationBufferMemoryllm…

QT 使用第三方庫QtXlsx操作Excel表

1.簡介 一直以來&#xff0c;都想學習一下C/C如何操作excel表&#xff0c;在網上調研了一下&#xff0c;覺得使用C/C去操作很麻煩&#xff0c;遂轉向QT這邊&#xff1b;QT有一個自帶的類QAxObject&#xff0c;可以使用他去操作&#xff0c;但隨著了解的深入&#xff0c;覺得他…

c++游戲制作指南(四):c++實現數據的存儲和讀取(輸入流fstream)

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f35f;歡迎來到靜淵隱者的csdn博文&#xff0c;本文是c游戲制作指南的一部&#x1f35f; &#x1f355;更多文章請點擊下方鏈接&#x1f355; &#x1f368; c游戲制作指南&#x1f3…

最長重復子數組(力扣)動態規劃 JAVA

給兩個整數數組 nums1 和 nums2 &#xff0c;返回 兩個數組中 公共的 、長度最長的子數組的長度 。 示例 1&#xff1a; 輸入&#xff1a;nums1 [1,2,3,2,1], nums2 [3,2,1,4,7] 輸出&#xff1a;3 解釋&#xff1a;長度最長的公共子數組是 [3,2,1] 。 示例 2&#xff1a; 輸…

新寶馬M5諜照曝光,侵略感十足,將與奧迪、梅賽德斯-AMG正面競爭

報道稱&#xff0c;寶馬即將推出全新一代M5&#xff0c;該車的諜照最近再次曝光。早先&#xff0c;寶馬 M5 Touring 旅行汽車的賽道測試圖片已經在網絡上流傳開來&#xff0c;預計該車將與奧迪的RS6 Avant和梅賽德斯-AMG E63 Estate展開正面競爭。 從最新曝光的照片來看&#x…

【操作系統考點匯集】操作系統考點匯集

關于操作系統可能考察的知識點 操作系統基本原理 什么是操作系統&#xff1f; 操作系統是指控制和管理整個計算機系統的硬件和軟件資源&#xff0c;并合理地組織調度計算機的工作和資源的分配&#xff0c;以提供給用戶和它軟件方便的接口和環境&#xff0c;是計算機系統中最基…

Python土力學與基礎工程計算.PDF-鉆探泥漿制備

Python 求解代碼如下&#xff1a; 1. rho1 2.5 # 黏土密度&#xff0c;單位&#xff1a;t/m 2. rho2 1.0 # 泥漿密度&#xff0c;單位&#xff1a;t/m 3. rho3 1.0 # 水的密度&#xff0c;單位&#xff1a;t/m 4. V 1.0 # 泥漿容積&#xff0c;單位&#xff1a;…

神經網絡基礎-神經網絡補充概念-53-將batch norm擬合進神經網絡

代碼實現 import numpy as np import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, BatchNormalization, Activation from tensorflow.keras.optimizers import SGD# 生成隨機數據 np.random.seed(0) X np.…

【0基礎入門Python筆記】一、python 之基礎語法、基礎數據類型、復合數據類型及基本操作

一、python 之基礎語法、基礎數據類型、復合數據類型及基本操作 基礎語法規則基礎數據類型數字類型&#xff08;Numbers&#xff09;字符串類型&#xff08;String&#xff09;布爾類型&#xff08;Boolean&#xff09; 復合數據類型List&#xff08;列表&#xff09;Tuple&…

代碼隨想錄DAY62

這個移動0的問題還是比較重要的 因為涉及到一種思想&#xff1a;快慢指針&#xff01; class Solution { public: void moveZeroes(vector<int>& nums) { int slow0,fast0; for(;fast<nums.size();fast){ if(nums[fast]!0){ swap(nums[slow],nums[fast]); slow;…

Kafka 什么速度那么快

批量發送消息 Kafka 采用了批量發送消息的方式&#xff0c;通過將多條消息按照分區進行分組&#xff0c;然后每次發送一個消息集合&#xff0c;看似很平常的一個手段&#xff0c;其實它大大提升了 Kafka 的吞吐量。 消息壓縮 消息壓縮的目的是為了進一步減少網絡傳輸帶寬。而…

故障012:定時備份作業-6007懸案

故障012&#xff1a;定時備份作業-6007懸案 1. 問題描述2. 解決過程2.1 大膽推想2.2 找規律2.3 嘗試換掉AP2.4 檢查資源限制2.5 資源放寬SYSDBA 3. 精神感悟 DM技術交流QQ群&#xff1a;940124259 1. 問題描述 詭異的現象總是伴隨著隱藏的功能被打開&#xff0c;可能耽誤你很…

比ChatGPT更強的星火大模型V2版本發布!

初體驗 測試PPT生成 結果&#xff1a; 達到了我的預期&#xff0c;只需要微調就可以直接交付&#xff0c;這點比ChatGPT要強很多. 測試文檔問答 結果&#xff1a; 這點很新穎&#xff0c;現在類似這種文檔問答的AI平臺收費都貴的離譜&#xff0c;星火不但免費支持而且效果也…

opencv圖片換背景色

#include <iostream> #include<opencv2/opencv.hpp> //引入頭文件using namespace cv; //命名空間 using namespace std;//opencv這個機器視覺庫&#xff0c;它提供了很多功能&#xff0c;都是以函數的形式提供給我們 //我們只需要會調用函數即可in…

uniapp評論列表插件獲取

從評論列表&#xff0c;回復&#xff0c;點贊&#xff0c;刪除&#xff0c;留言板 - DCloud 插件市場里導入&#xff0c;并使用。 代碼樣式優化及接入如下&#xff1a; <template><view class"hb-comment"><!-- 閱讀數-start --><view v-if&q…

5.利用matlab完成 符號矩陣的轉置和 符號方陣的冪運算(matlab程序)

1.簡述 Matlab符號運算中的矩陣轉置 轉置向量或矩陣 B A. B transpose(A) 說明 B A. 返回 A 的非共軛轉置&#xff0c;即每個元素的行和列索引都會互換。如果 A 包含復數元素&#xff0c;則 A. 不會影響虛部符號。例如&#xff0c;如果 A(3,2) 是 12i 且 B A.&#xff0…

java中excel文件下載

1、System.getProperty(user.dir) 獲取的是啟動項目的容器位置 2、 Files.copy(sourceFile.toPath(), destinationFile.toPath(), StandardCopyOption.REPLACE_EXISTING); StandardCopyOption.REPLACE_EXISTING 來忽略文件已經存在的異常&#xff0c;如果存在就去覆蓋掉它Sta…

00-認識C++

2、認識C 2.1、例子 一個簡單的C例子 #include <iostream>int main() {using namespace std; //使用名稱空間cout << "Com up and C me some time.";cout << endl; //換行符&#xff0c;還可以cout<<"\n";cout <…

驅動DAY5

1.實現設備文件和設備的綁定&#xff0c;編寫LED驅動 2.復習競態的解決方法和阻塞IO實現 第一個任務 頭文件 #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct{unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;u…

【MySQL系列】表內容的基本操作(增刪查改)

「前言」文章內容大致是對MySQL表內容的基本操作&#xff0c;即增刪查改。 「歸屬專欄」MySQL 「主頁鏈接」個人主頁 「筆者」楓葉先生(fy) 目錄 一、MySQL表內容的增刪查改1.1 Create1.1.1 單行數據全列插入1.1.2 多行數據指定列插入1.1.3 插入否則更新1.1.4 數據替換 1.2 Ret…