c++基礎學習第三天(指針,結構體)

c++基礎學習第三天(指針,結構體)

文章目錄

  • 1、指針
    • 1.1、指針的基本概念
    • 1.2、指針變量的定義和使用
    • 1.3、 指針所占內存空間
    • 1.4、空指針和野指針
    • 1.5、 const修飾指針
      • 1.5.1、const修飾指針-常量指針
      • 1.5.2、const修飾常量-指針常量
      • 1.5.3、const即修飾指針,又修飾常量
  • 2、結構體
    • 2.1、結構體基本概念
    • 2.2、結構體定義和使用
    • 2.3、結構體數組
    • 2.4、結構體指針
    • 2.5、結構體嵌套結構體
    • 2.6、結構體做函數參數
    • 2.7、結構體中const使用場景


1、指針

1.1、指針的基本概念

指針的作用:可以通過指針間接訪問內存

  • 內存編號是從0開始記錄的,一般用十六進制數字表示
  • 可以利用指針變量保存地址

1.2、指針變量的定義和使用

指針變量定義語法:*數據類型 變量名;

//1、定義指針
int a1 = 10;
// 指針定義的語法:數據類型 * 指針變量名:
int *p;
// 讓指針記錄變量a的地址
p = &a1;
cout << "a的地址為:" << &a1 << endl;
cout << "指針p為:" << p << endl;
//2、使用指針
//可以通過解引用的方式來找到指針指向的內存,查看內存內容。
//指針前加 * 代表解引用,找到指針指向的內存中的數據
*p = 1000;
cout << "a1 = " << a1 << endl;
cout << "*p=" << *p << endl;

1.3、 指針所占內存空間

提問:指針也是種數據類型,那么這種數據類型占用多少內存空間?

在32位操作系統下:占用4個字節空間,64位下占8個字節。不管是什么數據類型

//指針所占內存空間
int a2 = 10;
//int p;
//p=&a:
int *p1 = &a2;
//在32位操作系統下,指針是占4個字節空間大小,***不管是什么數據類型***
//在64位操作系統下,指針是占8個字節空間大小
cout << "sizeof(int*)=" << sizeof(int*) << endl;
cout << "sizeof (float*)=" << sizeof(float*) << endl;
cout << "sizeof (double*)=" << sizeof(double*) << endl;
cout << "sizeof(char*)="<< sizeof(char*) << endl;

1.4、空指針和野指針

空指針:指針變量指向內存中編號為0的空間
用途:初始化指針變量
注意:空指針指向的內存是不可以訪問的

空指針

//1、空指針用于給指針變量進行初始化
int *p4 =  NULL;
// 2、空指針(0號內存空間)是不可以進行訪問的
//0~255之間的內存編號是系統占用的,因此不可以訪問
//*p = 100;

野指針:指針變量指向非法的內存空間(不是自己申請的內存空間)

/野指針
//在程序中,盡量避免出現野指針
int *p = (int*)0x1100;
cout << * p << endl;

總結:空指針和野指針都不是我們申請的空間,因此不要訪問。

1.5、 const修飾指針

const修飾指針有三種情況:

1.5.1、const修飾指針-常量指針

const int *p=&a:

常量指針
特點:指針的指向可以修改,但是指針指向的值不可以改
*p=20;錯誤,指針指向的值不可以改
p=&b;正確,指針指向可以改

1.5.2、const修飾常量-指針常量

int * const p=&a:

指針常量
特點:指針的指向不可以改,指針指向的值可以改
*p=20;正確,指向的值可以改
p=&b;錯誤,指針指句不可以改

1.5.3、const即修飾指針,又修飾常量

const int * const p =a;

特點:指針的指向和指針指向的值都不可以改
*p=20;/錯誤
p=&b;/錯誤

//1、const修飾指針   常量(const)指針(*)
int a4 = 10;
int b4 = 10;
const int * p7 = &a4;
//指針指向的值(*P)不可以改,指針的指向(p)可以改
//*p=20:錯誤
p7 = &b4;//正確//2、const修飾常量 指針(*)常量(const)
//指針的指向(p2)不可以改,指針指向的值(*p2)可以改
int * const p5 = &a4;
*p5 = 100; // 正確的
//p2=&b:/錯誤,指針的指向不可以改// 3、const修飾指針和常量
const int * const p6 = &a4;
//指針的指向和指針指向的值都不可以改
//*p3=100;//錯誤
//b3 = &b; //錯誤

2、結構體

2.1、結構體基本概念

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

2.2、結構體定義和使用

語法:struct 結構體名 {結構體成員列表};
通過結構體創建變最的方式有三種:

  • struct 結構體名 變量名
  • struct 結構體名 變量名={成員1值,成員2值…}
  • 定義結構體時便創建變星

通過學生類型創建具體學生

//2.1 struct Student sl
struct Student s1;
//給s1屬性賦值,通過.訪問結構體變量中的屬性
s1.name = "張三";
s1.age = 18;
s1.score = 100;
cout << "姓名:" << s1.name << "  年齡:" << s1.age << "  分數:" << s1.score << endl;
//2.2 struct Student s2 ={..};
struct Student s2 = { "李四",19,80 };
cout << "姓名:" << s2.name << "  年齡:" << s2.age << "  分數:" << s2.score << endl;
//2.3在定義結構體時順便創建結構體變量
struct Student1 {//成員列表// 姓名string name;// 年齡int age;//分數int score;
}s3;s3.name = "王五";
s3.age = 20;
s3.score = 60;
cout << "姓名:" << s3.name << "  年齡:" << s3.age << "  分數:" << s3.score << endl;

struct關鍵字可以省略(創建變量時),定義時struct關鍵字不可以省略。
總結1:定義結構體時的關鍵字是struct,不可省略
總結2:創建結構體變是時,關鍵字structi可以省略
總結3:結構體變量利用操作符"."訪門成員

2.3、結構體數組

作用:將自定義的結構體放入到數組中方便維護
語法:struct 結構體名 數組名[元素個數]={{},{},·{}};

//1、創建結構體數組
struct Student stuArray[3]{{"張三",18,100},{"李四",28, 99},{ "王五",38,66}
};
// 2、給結構體數組中的元素賦值
stuArray[2].name = "趙六";
stuArray[2].age = 80;
stuArray[2].score = 60;
// 3、遍歷結構體數組
for (int i = 0; i < 3; i++) {cout<< "姓名:"<<stuArray[i].name<<"年齡:"<<stuArray[i].age<< "分數:"<< stuArray[i].score<< endl;
}

2.4、結構體指針

作用:通過指針訪問結構體中的成員
利用操作符->可以通過結構體指針訪問結構體屬性

//1、創建學生結構體變量
struct Student s = { "張三",18,100};
//2、通過指針指向結構體變量
struct Student *p =&s;
//3、通過指針訪問結構體變量中的數據
cout << "姓名:" << p->name << "年齡:" << p->age << "分數:" << p->score << endl;

2.5、結構體嵌套結構體

作用:結構體中的成員可以是另一個結構體
例如:每個老師輔導一個學員,一個老師的結構體中,記錄一個學生的結構體

//定義學生結構體
struct student{string name; // 姓名int age;//年齡int score; // 分數
};//定義老師結構體
struct teacher {int id;//教師編號string name; // 教師姓名int age;//年齡struct student stu;//輔導的學生
};//結構體嵌套結構體
//創建老師
struct teacher t;
t.id = 10000;
t.name = "老王";
t.age = 50;
t.stu.name = "小王";
t.stu.age = 20;
t.stu.score = 60;
cout << "老師姓名:" << t.name << "老師編號:" << t.id << "老師年齡:" << t.age<< "老師輔導的學生姓名:" << t.stu.name << "學生年齡:" << t.stu.age<< "學生考試分數為:" << t.stu.score<<endl;

2.6、結構體做函數參數

作用:將結構體作為參數向函數中傳遞
傳遞方式有兩種:

  • 值傳遞
  • 地址傳遞

總結:如果不想修改主函數中的數據,用值傳遞反之用地址傳遞

2.7、結構體中const使用場景

作用:用const來防止誤操作

將函數中的形參改為指針,可以減少內存空間,而且不會復制新的副本出來
void printStudents(const student *s)防止函數修改屬性值
指針(地址傳遞)節省空間,值傳遞會復制一份給函數內的變量。

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

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

相關文章

Android MediaCodec 簡明教程(五):使用 MediaCodec 編碼 ByteBuffer 數據,并保存為 MP4 文件

系列文章目錄 Android MediaCodec 簡明教程&#xff08;一&#xff09;&#xff1a;使用 MediaCodecList 查詢 Codec 信息&#xff0c;并創建 MediaCodec 編解碼器Android MediaCodec 簡明教程&#xff08;二&#xff09;&#xff1a;使用 MediaCodecInfo.CodecCapabilities 查…

php:實現字符串補零str_pad()

說明 str_pad($input_string, $total_length, $pad_string, $pad_type); $input_string 是要填充的原始字符串。$total_length 是填充后的字符串總長度&#xff0c;包括原始字符串的長度。$pad_string 是用于填充的字符&#xff0c;通常是零。$pad_type 是填充的位置&#xff0…

欲哭無淚,2024年軟考有變!中高項只考1次了

今天可能最重磅的消息是&#xff1a;2024年軟考工作安排及有關事項的通知文件在瘋傳&#xff0c;這份文件中提到了&#xff1a; 軟考高級方面&#xff1a; 信息系統項目管理師從2次改為了1年只考1次&#xff0c;放在了上半年考。 系統規劃與管理師依然保持1次&#xff0c;但是…

每日一練:LeeCode-707. 設計鏈表 【鏈表+虛擬頭結點+設計】

每日一練&#xff1a;LeeCode-707. 設計鏈表 【鏈表虛擬頭結點設計】 思路設置虛擬頭節點 本文是力扣 每日一練&#xff1a;LeeCode-707. 設計鏈表 【鏈表虛擬頭結點設計】 學習與理解過程&#xff0c;本文僅做學習之用&#xff0c;對本題感興趣的小伙伴可以出門左拐LeeCode-70…

0101二階與三階行列式-行列式-線性代數

一 引例 求解二元一次方程組 { a 11 x 1 a 12 x 2 b 1 a 21 x 1 a 22 x 2 b 2 \begin{cases} a_{11}x_1a_{12}x_2b_1\\ a_{21}x_1a_{22}x_2b_2\\ \end{cases} {a11?x1?a12?x2?b1?a21?x1?a22?x2?b2?? 解&#xff1a; 1 a 21 ? 2 a 11 ? x 2 a 11 b 2 ? a…

Python函數的閉包

嵌套函數 在一個函數內部定義的函數稱為嵌套函數 閉包的形成 內層函數對外層函數非全局變量的引用就會形成閉包 閉包作用 保證數據安全 例子 li [] def average(value):li.append(value)return sum(li)/len(li) 如上面代碼li[]這個列表人人都能修改&#xff0c;這樣就…

自然語言處理實戰項目26-NLP模型訓練中前置應用之分詞方法的應用

大家好,我是微學AI,今天給大家介紹一下自然語言處理實戰項目26-NLP模型訓練中前置應用之分詞方法的應用。本文詳細介紹了自然語言處理(NLP)模型訓練中前置應用之分詞方法的應用。文章首先簡要概述了NLP的概念和分詞在其中的重要性。隨后,文章詳細介紹了四種主要的分詞方法…

MQL5學習之簡單移動平均線MA的編寫

昨天還是有點高估自己了&#xff0c;MACD相對較難一點&#xff0c;改學MA的編寫&#xff0c;首先明確MA的計算&#xff0c;假如有4個值&#xff0c;p[1&#xff0c;2&#xff0c; 3&#xff0c; 4], period3, 則v[0]p[0], v[1]p[1],v[2](p[0]p[1]p[2])/32, v[3](v[2]*3p[3]-p…

瀏覽器展示Blob/File文件

1. 瀏覽器展示Blob/File文件 I.Blob格式轉Base64格式 當我們接收到后端傳輸過來的文件時&#xff0c;很多時候我們需要將傳過來的文件轉為Base64格式。如后端傳來驗證碼圖片時等 下面將提供函數&#xff1a; // Blob轉Base64 export const blobToBase64 (blob: Blob) >ne…

ChatGPT論文指南|ChatGPT如何助力論文中的數據分析!【建議收藏】

點擊下方▼▼▼▼鏈接直達AIPaperPass &#xff01; AIPaperPass - AI論文寫作指導平臺 公眾號原文▼▼▼▼&#xff1a; ChatGPT論文指南|ChatGPT如何助力論文中的數據分析&#xff01;【建議收藏】 小編在之前的論文寫作流程中&#xff0c;介紹了大量論文文字工作&#xff…

Effective objective-c-- 內存管理

Effective objective-c-- 內存管理 前言理解引用計數引用計數工作原理屬性存取方法中的內存管理自動釋放池保留環要點 以ARC簡化引用計數使用ARC時必須遵循的方法和命名規則變量的內存管理語義ARC如何清理實例變量覆寫內存管理方法要點 在dealloc方法中只釋放引用并解除監聽要點…

Mybatis-Plus 5分鐘快速上手,10分鐘熟練使用

小伙伴們好&#xff0c;歡迎關注&#xff0c;一起學習&#xff0c;無限進步 以下為學習 mybatis-plus 過程中的筆記 mybatis-plus 官網地址&#xff1a;https://mp.baomidou.com/ 文章目錄 特性快速開始mybatis-plus 配置插入測試及雪花算法主鍵生成策略查詢更新刪除查詢指定字…

Text2SQL 和 智能問答 的提示詞寫法

Text2SQL 生成 Query SQL System Message You are a {dialect} expert. Given an input question, creat a syntactically correct {dialect} query to run. Unless the user specifies in the question a specific number of examples to obtain, query for at most {top_k} r…

Linux 創建.NET 服務

文章目錄 創建服務啟用服務啟動 & 重啟服務查看服務狀態問題排查 創建服務 將服務文件上傳到 /home/mes/api-mes-dev, 其他服務修改對應的目錄在 /usr/lib/systemd/system/ 創建 mesapi-dev.service, 其他服務修改對應文件名 [Unit] Descriptionmesapi-dev service[Servi…

探索Linux世界:初次接觸和基本指令(文件操作)

文章目錄 1.基本介紹和準備2.基本指令和Linux的基本操作3.幾個重要基本指令3.1 ls - 列出文件和目錄3.1.1文件的知識3.1.2 .和..文件 3.2pwd - 顯示當前工作目錄3.2.1路徑知識 3.3 cd - 切換目錄3.4 touch - 創建文件或更新時間戳3.5mkdir - 創建新目錄3.6rm - 刪除文件或目錄3…

leetcode熱題100學習計劃-鏈表-反轉鏈表

思路 使用頭插法逆轉鏈表 注&#xff1a;鏈表一般為操作方便&#xff0c;頭結點不存值&#xff0c;是一個虛擬節點 代碼 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val)…

深入了解 Android 中的 FrameLayout 布局

FrameLayout 是 Android 中常用的布局之一&#xff0c;它允許子視圖堆疊在一起&#xff0c;可以在不同位置放置子視圖。在這篇博客中&#xff0c;我們將詳細介紹 FrameLayout 的屬性及其作用。 <FrameLayout xmlns:android"http://schemas.android.com/apk/res/androi…

【數據結構和算法初階(C語言)】帶環鏈表問題詳解(快慢指針的燒腦應用)

目錄 1.鋪墊-----帶環鏈表基本了解 2. 題目&#xff1a;環形鏈表 3.環形鏈表|| ?編輯 3.1題解1 3.2 題解2 4.總結 1.鋪墊-----帶環鏈表基本了解 環形鏈表題目啟迪&#xff1a; 環形鏈表特點&#xff1a;遍歷鏈表會出現一模一樣的地址 2. 題目&#xff1a;環形鏈表 給…

數字化轉型導師鵬:政府數字化轉型政務服務類案例研究

政府數字化轉型政務服務類案例研究 課程背景&#xff1a; 很多地方政府存在以下問題&#xff1a; 不清楚標桿省政府數字化轉型的政務服務類成功案例 不清楚地級市政府數字化轉型的政務服務類成功案例 不清楚縣區級政府數字化轉型的政務服務類成功案例 課程特色&#x…

基于C語言實現內存型數據庫(kv存儲)

基于C語言實現內存型數據庫(kv存儲) 文章目錄 基于C語言實現內存型數據庫(kv存儲)1. 項目背景1.1 Redis介紹1.2 項目預期及基本架構 2. 服務端原理及代碼框架2.1 網絡數據回環的實現2.2 array的實現2.3 rbtree的實現2.4 btree的實現2.5 hash的實現2.6 dhash的實現2.7 skiplist的…