c++入門學習 ----Hello World->結構體(個人筆記)

来源:https://www.cnblogs.com/PrograMMer-Ben/archive/2022/04/10/16124727.html
-Advertisement-
Play Games

#include<iostream>using namespace std;int main(){ cout << "Hello World" << endl; system("pause"); return 0;} 在控制臺中 輸出 Hello world 變數的作用: 給一段指定的記憶體空間起名, ...


#include<iostream>
using namespace std;
int main()
{
cout << "Hello World" << endl;

system("pause");
return 0;
}

在控制臺中 輸出 Hello world

變數的作用: 給一段指定的記憶體空間起名,方便反操作這段記憶體
方便我們管理記憶體空間
在記憶體中 我們有一個變數 10 , 他的記憶體編號是十六進位的
例如: 0x0000 => 10 那我們要找這個記憶體 數據量一大 就比較麻煩了 都是16進位數
所以 我們起了個a 來作為變數名(方便管理記憶體空間)

常量: 用於記錄程式中不可更改的數據
c++有兩種方式
#define 巨集常量 在文件上方定義表示一個常量
const所修飾的變數 在變數前+const 不可更改

#define day 7 //在頭文件那邊
coust int a = 10; //這個也不可修改 也會報錯

數據類型: 整型

short 短整型 占用2位元組
int 整型 4位元組
long 長整型 Windows為 4位元組 , linux為4位元組(32位操作系統),8位元組(64位操作系統)
long long 長長整型 8位元組

數據類型 浮點型

float 單精度浮點數 4位元組
double 雙精度浮點數 8位元組
如果只寫 float a = 3.14;
那這樣 這個3.14這邊是 double 類型的, 之後程式之後會進行一個轉換,會把3.14轉換成float
多了一個數據轉換的過程

//科學計數法
float f1 = 3e2;//e的後面是一個正數 代表了 3* 10的2次方 代表300

float f2 = 3e-2;//e的後面是一個負數 代表了 3* 0.1的2次方 代表0.03

數據類型 字元
char ch = 'a';
只能寫1個字元
c和c++中 字元變數只占一個位元組
字元型變數並不是把字元本身放到記憶體中存儲,而是將對應的ascll編碼放入到存儲單元

數據類型 字元串
char a[] = "123123";//c語言風格的字元串
string a = "bbb";//c++語言風格的字元串
#include<string>;//在使用c++風格的字元串的時候 要引用頭文件

數據類型: bool 布爾

bool類型占 1個位元組大小

sizeof 求出 數據類型占用記憶體大小
sizeof(數據類型/變數)

轉義字元:不能顯示出來的ASCll字元

數據的輸入 cin 關鍵字
cin>>a 將控制台輸入的 數字 賦值給a

數組:就是一個集合 裡面存放了 相同的數據類型
數組是由連續的記憶體位置組成的;

一維數組
可以統計整個數組在記憶體中的長度
可以獲取數組在記憶體中的首地址

&取地址符號

二維數組 矩陣數組
int a[4][5] ;
為4 行 5 列的 二維矩陣數組

函數的定義
返回值類型 函數名 (參數列表){
函數體
return 表達式:
}
函數必須寫在Main方法後面 要嘛就必須得聲明函數 讓編譯器知道你有這個 函數的名稱 以及如何調用函數

函數的分文件寫法:
創建.h 尾碼名的頭文件
創建.cpp尾碼名的源文件
在頭文件中寫函數的聲明
在源文件中寫函數的定義

這是在c++中寫的順序
我們在 .h 頭文件聲明的 那個方法 ,得有
#include<iostream>
using namespace std;
這兩行
之後在你的 源文件那邊 需要 引用你的 頭文件

之後在我們Main方法那邊 需要引用 頭文件

指針
可以通過指針間接訪問記憶體
記憶體編號都是從0開始記錄的 用16進位數來表示
可以利用指針變數保存地址

int a= 10 ; 記憶體中是 10這個數據, 用a來找 編號0x0001;
我用一個 p 來存儲 0x0001 這個地址 那這個 p 就是指針

用p這個指針來記錄了 a的地址
int * p = &a;

如何使用指針
通過解引用的方式來找到指針指向的記憶體
指針前 加一個 * 號 ,代表解引用,代表你找到了 p指針存儲在記憶體中的數據
*p

我們把 *p 改為1000 *p = 1000;
那記憶體中的地址中的數據也一樣發生改變 a的數據也是1000;

指針也是一種數據類型 是指針變數
指針變數占的記憶體空間是多少?
在 32位操作系統下 都是 占用4個位元組空間

在64位操作系統下 占用8個位元組空間

空指針和 野指針
空指針: 指針變數指向記憶體中編號為0的空間
用途:初始化指針變數
//空指針
// 空指針用於給指針變數進行初始化
註意:空指針指向的記憶體是不可以訪問的 ;
0~255 之間的記憶體編號是系統占用的 不允許更改,訪問

int* p = NULL; //這個就是空指針的寫法

這就是野指針,這種問題 不會被編譯器所發現 編譯會通過 但是會報錯啟動後
(讀取訪問許可權異常)
在程式中要避免出現這種野指針
int* p = (int *) 0x1100;
cout << *p << endl;
0x1100 並沒有什麼開闢記憶體 你直接指向 就會有問題

const 修飾指針
const 修飾指針 ----常量指針
const 修飾常量 ----指針常量
const 既修飾指針, 又修飾常量

const 常量指針: \
就是在指針前面加 const
const int * p =&a;
當他是常量指針的時候 指針的指向的地址 可以修改 , 但是 指針指向的值不可以修改
const int * p = &a;
*p = 20 ; //錯誤
*p = &b ; //正確

指針常量
int * const p = &a; //這就是 指針常量 在const後面的是 常量 那就是 指針常量
指針的指向 不可以改 但是 指向的值可以更改
*p = 20 ; //正確
*p = &b ; //錯誤

const 既修飾了指針 又修飾常量
const int * const p = &a;那就兩個都不可以修改
*p = 20 ; //錯誤
*p = &b ; //錯誤


指針與數組
//利用指針訪問數組中的元素
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = arr;//arr 就是 數組的首地址
cout << "第一個數據-------" << *p;
for (int i = 0; i < 10; i++)
{
cout << "第" << i+1 << "個數據是=" << *p<<endl;
p++;
}
p++;//指針像後偏移四個位元組 ;

指針與函數
作用 利用指針作函數的參數 可以 修改 實參的值
其實就是 地址 傳遞 就是根據你傳入的那個地址,利用記憶體地址 來 操作 那個 數據
最後 你外部的 那個被取地址的數據 如果在內部有改變 你外部也會發生改變 ;
void GetSum(int *a, int *b,int *c)
{
*c = *a + *b;
}
void Main()
{
int a = 10 ;
int b = 20 ;
int c = 0 ;
GetSum(&a,&b,&c);
}
根據上面的方法 最後輸出的 c 就是 30 ;


結構體

結構體屬於用戶自定義的數據類型,允許用戶存儲不同的數據類型

struct 結構體名 {};

實例化結構體的 三種方法

struct Student s1;
struct Student s1={變數1,變數2,變數3}// 必須一一對應
還有一個就是在 創建結構體的時候在後面直接創建
struct 結構體名 {}s1;

在創建結構體不可以省略 struct
在調用創建的時候可以省略 struct

結構體數組
struct 結構體名 數組名[個數] = {{} , {} , {} };

結構體指針

//創建結構體變數
Student s1 = {"結構體",18,100};
//通過 指針p 取得 結構體的地址
Student* p = &s1;
//通過 -> 來獲得結構體中的屬性
p->age;

如果要獲得 指針指向的結構體的數據 那就需要 用 ->來獲得他的數據

結構體嵌套結構體
1:
Student s1 = {"",18,100};
Teacher teacher = { 1,18,"老師",s1 };
2:
Teacher t1;
t1.age = 1;
t1.id = 2;
t1.name = 3;
t1.stu.age = 18; t1.stu.name = "學生"; t1.stu.score = 100;
兩種方法都可以
在第二個方法中 必須在結構體中 創建 Student這個 結構體的時候 要加上 struct

在結構體中 const的使用場景
在 函數中 void Prist(const student * stu)
{
}
這樣就不會在函數中修改這個結構體 ,如果要修改 就不要加const
防止誤操作

將函數中的形參改為指針,可以減少記憶體空間 而且不會有多餘的副本產生

搜索

複製


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 記錄自己是如何分析地震數據集,使用模塊,剋服一系列 bug 的過程。經緯度轉換省份城市、讀取 csv、多圖表合併 pyecharts、導入模塊、省份強震次數圖、地震震級分佈圖、國內前十大地震、震級震源深度散點圖、世界地震熱力圖、中國地震熱力圖、年月地震次數曲線圖、24小時段地震發生百分比圖、最大震級... ...
  • 前言 其中的過程適用於靜態網頁(豆瓣電影信息、嗶哩嗶哩評論區等)、動態頁面(百度圖片滾輪觸發頁面更新、下拉框觸發頁面更 新等url不變但通過滑鼠互動,致使信息更新等場景)的信息爬取。 基本適用於所有網頁信息的爬取,但代碼不夠簡潔,下述流程不夠詳細。 1 Selenium安裝 Python學習交流Q群 ...
  • 前言 又到每日分享Python小技巧的時候了,大家想看啥呢?想看的可以留言噢。今天給大家分享一個考試系統測試腳本吧,源碼對於我本人比較懶,截圖給大家,喜歡的點贊。 T007 Web-python+selenium-自動化測試技術-線上考試系統測試腳本: 正文 代碼就給大家截圖放在下麵了,需要的小伙伴 ...
  • TCP協議發送數據 A:創建Socket對象 利用Socket對象 B:獲取輸出流,寫數據 C:釋放資源 package Day26; import java.io.IOException; import java.io.OutputStream; import java.net.Socket; / ...
  • 類從被載入到虛擬機記憶體中開始,到卸載出記憶體截止,整個生命周期包括:載入、驗證、準備、解析,初始化、使用、卸載七個階段。其中驗證、準備、解析三個部分統稱為連接。 類初始化情況: 遇到new、getstatic、putstatic 或 invokestatic 這4條位元組碼指令時,如果沒有初始化,則需要 ...
  • URI在網路請求中必不可少,Spring提供了一些工具類用於解析或者生成URL,比如根據參數生成GET的URL等。本文會對Spring MVC中的URI工具進行介紹,本文主要參考Spring官方文檔。 工具類UriComponents UriComponentsBuilder可以用於根據URL和參數 ...
  • 流水淡,碧天長,鴻雁成行。編碼風格,簡捷清爽,反引無限風光。 在美劇《矽谷》中有這樣一個經典鏡頭,主人公 Richard 與同為開發工程師的女友鬧分手,理由是兩人對縮進方式有著截然不同的編程習慣,互相鄙視對方的代碼風格。Richard 認為" one tab saves four spaces ”, ...
  • @(文章目錄) 二、Java之萬年曆 2.1 要求 輸入年份; 輸入月份; 輸出某年某月的日曆。 2.2 思路 實現從控制台接收年和月,判斷是否是閏年(判斷是否是閏年:能被4整除但不能被100整除;或者能被400整除); 計算輸入月份的天數; 計算該月第一天是星期幾; 3.1 計算輸入年份距離190 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...