主頁 > 軟體設計 > 指標和結構體(初級)

指標和結構體(初級)

2021-08-07 08:38:15 軟體設計

在這里插入圖片描述

目錄

  • 前言
  • 指標是什么
    • 總結:指標就是變數,用來存放地址的變數,(存放在指標中的值都被當成地址處理)
    • 指標和指標型別
    • 指標的關系比較
    • 指標-指標
    • 指標和陣列的關系
    • 二級指標
    • 指標陣列
    • 野指標
    • 野指標的原因
    • 避免野指標的方法
  • 結構體
    • 結構的基礎知識
    • 結構體的宣告和定義
    • 創建結構體的偷懶式寫法(簡潔版)
    • 結構體變數定義初始化
    • 結構體嵌套
    • 結構體變數傳參
      • 1、值傳遞
      • 2、地址傳遞
  • 總結:地址傳遞效率更高

前言

作為一名C程式員,學會指標是我們的首要關鍵,靈活運用指標又是對個人能力的體現,想從此刻學好指標請跟著博主來

指標是什么

在計算機科學中,指標(Pointer)是編程語言中的一個物件,利用地址,它的值直接指向

(points to)存在電腦存盤器中另一個地方的值,由于通過地址能找到所需的變數單元,可以

說,地址指向該變數單元,因此,將地址形象化的稱為“指標”,意思是通過它能找到以它為地址的記憶體單元

在這里插入圖片描述

總結:指標就是變數,用來存放地址的變數,(存放在指標中的值都被當成地址處理)

每個地址標識一個位元組,那我們就可以給 (2^32Byte == 2^32/1024KB ==

232/1024/1024MB==232/1024/1024/1024GB == 4GB) 4G的空閑進行編址,

同樣的方法,那64位機器,如果給64根地址線,那能編址多大空間,自己計算,

這里我們就明白:

在32位的機器上,地址是32個0或者1組成二進制序列,那地址就得用4個位元組的空間來存盤,所

以一個指標變數的大小就應該是4個位元組,

那如果在64位機器上,如果有64個地址線,那一個指標變數的大小是8個位元組,才能存放一個地

址,

總結:

1、指標是用來存放地址的,地址是唯一標示一塊地址空間的,

2、指標的大小在32位平臺是4個位元組,在64位平臺是8個位元組

指標和指標型別

總結:指標的型別決定了指標向前或者向后走一步有多大(距離),

指標作用域

int main()
{
	int n = 0x11223344;
	char *pc = (char*)&n;
	int *pi = &n;
	*pc = 0;
	pi = 0;

	return 0;
}

總結: 指標的型別決定了,對指標解參考的時候有多大的權限(能操作幾個位元組), 比如: char* 的

在這里插入圖片描述
在這里插入圖片描述

在我們的除錯視窗中可以看到,此時的pi,pc指標都指向著變數n,程式進一步往下走
在這里插入圖片描述
注意:斷點走到哪一行表示這一行還沒執行,斷點的上一行剛剛執行,此時的斷點走到了11行,表示第10行已經執行,這個程序我們記錄了*pc只改變了變數n在記憶體中的第一個位元組,
在這里插入圖片描述

而指標*pi卻能改變四個位元組

總結:char指標解參考就只能訪問一個位元組,而 int 的指標的解參考就能訪問四個位元組,

指標的關系比較

以下代碼的作用是遍歷修改陣列中的每一個元素

#define N_VALUES 5

float values[N_VALUES];

float *vp;


for (vp = &values[0]; vp < &values[N_VALUES];)

{

     *vp++ = 0; 
}

眼尖的小伙伴可能會覺得這樣一弄不是就越界了嗎?
在這里可以注意的是下標為5的陣列地址可以用來必較VP地址間的關系,這是因為標準規定

注意這里的 vp++ 不得不說前置++與后置++跟指標的關系是緊密結合的,務必把這里的優先級搞清楚, 因為++的優先級要高于(解參考), 但又因為這是后置++(先用后加),所以會先計算 *(vp++),對vp解參考找到vp地址將vp地址對應的內容修改為0,之后指標再++,(注意這里是float型指標,占四個位元組,指標步長為4,請務必結合前面內容加以理解)

vp < &values[N_VALUES],指標的關系運算,兩個指標之間比較大小

指標-指標

指標 - 指標 得到的數字的絕對值是指標和指標之間元素的個數,這句話是什么意思?
讀代碼理解

int main()
{
    int arr[10] = {1,2,3,4,5,6,7,8,9,0};
    printf("%d\n",&arr[9] - &arr[0]);//9
    printf("%d\n",&arr[0] - &arr[9]);//-9
    return 0;
}

這句話的意思其實無非就是說,在一段連續的空間里(我這里是陣列),有了地址頭(&arr[0]),又有了地址尾(&arr[9]),這兩個指標一減,得到的結果值其實就是我們的元素個數

模擬strlen函式(指標減指標)
以下是通過模擬strlen函式的實作,也是通過兩地址相減,取得字符間的個數

int my_strlen(char *str)
{
    char* start = str;//指標備份
    if(*str != '\0')
    {
       str++;       
    }
    return str - start;//兩指標相減得到字符個數
}

指標和陣列的關系

陣列名是陣列首地址,但是有兩個例外
1、sizeof(陣列名) - 陣列名不是首元素地址,是表示整個陣列,這里計算的是整個陣列的大小,單位是位元組
2、&陣列名 - 這里的陣列名不是首元素的地址,是表示整個陣列的,拿到的是這個陣列的地址 -

額外補充(圖解):

以上觀察貌似區別不大,似乎也不足以證明&arr就是整個陣列的地址,看下一步

我們直到arr 跟 &arr[0]都是陣列首地址(陣列首元素地址),當它們 + 1后是跳過一個整形的地址,而&arr表示的是整個陣列的地址,整個陣列的地址不就是40位元組嗎?在視窗中可以看到游標選中的那一行,跟它的下一行之間是相差了40個位元組的,因為16進制的28 就是十進制的40,這一點足以證明&arr取出的是整個陣列的地址

既然可以把陣列名當成地址存放到一個指標中,那么我們就可以使用指標來訪問一個陣列

int main()
{
    int arr[10] = {1,2,3,4,5,6,7,8,9,0};
    int len = sizeof(arr) / sizeof(arr[0]);
    int i = 0;
    for(i = 0; i < len; i++)
    {
        printf("%d",*(p + i));    
    }
    return 0;
}

二級指標

int main()
{
    int a = 10;
    int *p = a;  //指標變數存放a的地址
    int **pp = &p;//二級指標存放一級指標的地址
    int ***ppp = &pp;//三級指標存放二級指標的地址
    return 0;
}
    上述代碼可以這么理解和記憶
    int *p = a        ==》 *p表示的是一個指標變數,指標變數指向的物件型別是int型別
    
    int* *pp = &p     ==》 *p表示的是一個指標變數,指標變數指向的物件型別是int*型別
    
    int** *ppp = &pp  ==》*p表示的是一個指標變數,指標變數指向的物件型別是int**型別

以下主要講解到二級指標的邏輯,因為二級指標已經是我們理解和使用的極限了,代碼書寫的時候并不是寫的越復雜,才越是高質量,恰恰是以最能讓別人能夠看得懂才是優質的代碼,因為這樣大大便于軟體的維護和測驗

這是以上代碼得到的測驗結果,為了便于大家理解,簡單的打個比方
1、假設我們現在有3個抽屜和2把鑰匙
2、抽屜1存放的是區域變數a
3、抽屜2存放的是*p
4、抽屜3存放的是**pp

邏輯梳理:首先我們如果想改變區域變數a的值是可以的并且有兩種方法,
方法一:直接修改變數a的值
方法二:通過一級指標*p拿到變數a的地址,從而修改變數a
方法三:通過二級指標 *pp 一解參考拿到了一級指標,再通過對一級指標解參考就會找到區域變數a,從而修改變數a的值

主要講解二級指標:如果我們把二級指標看成一個抽屜的話,那么打開抽屜的第一時間就會找到一把鑰匙,這把鑰匙就是&p
鑰匙對應打開的箱子是序號2吧,當我們打開了第二個箱子的話,此時2號箱子里存放的就是&a鑰匙了,那有了這一把鑰匙于是乎就可以再去打開1號箱子了,1號箱子里存放的是變數a,那么是不是就可以直接操作變數a了?答案是可以

指標陣列

如何理解指標陣列呢?
首先指標陣列的本質上是一個陣列,指標陣列的屬性是每一個元素都是一個指標變數,既然他是一個陣列的話想必一定是一塊連續存盤的空間了,每一個元素都是一個指標變數?那么是不是每一個元素都可以用來存放一個變數的地址,指向這個變數?

#include<stdio.h>
int main()
{
	int a = 0;
	int b = 2;
	int c = 4;
	int *arr[3] = {&a,&b,&c};
	int len = sizeof(arr) / sizeof(arr[0]);

	int i = 0;
	for (i = 0; i < len; i++)
	{
		printf("%d ",*(arr[i]));
	}
	return 0;
}

注意不要寫成 int len = sizeof(arr) / sizeof(*(arr[0]));這種形式,陣列型別是整形陣列時必然不會存在什么問題但是如果是char 型別呢,

在我們的除錯視窗下可以很清晰的看得到len的值居然是12,所以不要寫成這種方式的,原因也很簡單,因為指標在32位系統下是默認占4位元組,我們測驗的環境就是在
32系統下,那么sizeof(arr)計算的是整個陣列的大小(位元組),而 sizeof((arr[0]))他是取出指標變數指向的那個地址上對應的值,由于這里涉及到隱士型別轉換,所以最終sizeof((arr[0]))求得的是1個位元組,12 / 1 = 12,答案不就出來了嗎,這里交代的是一個細節問題

回歸到正題想必大家應該知道這段代碼的功能吧,沒錯就是依次取出陣列中的指標,再對指標解參考,找到指標指向的那個變數逐個列印出來

看到這里大家應該已經明白了,指標陣列是一個陣列,由于指標陣列的每一個元素都是一個指標變數,指標變數具有指向性

野指標

概念: 野指標就是指標指向的位置是不可知的(隨機的、不正確的、沒有明確限制的)

野指標的原因

1、指標未初始化
2、指標越界訪問
3、指標指向的空間釋放

避免野指標的方法

1、指標初始化
2、小心指著越界
3、指標指向空間釋放即使置NULL
4、指標使用之前檢查有效性

結構體

結構的基礎知識

結構是一些值的集合,這些值稱為成員變數,結構的每個成員可以是不同型別的變數

結構體的宣告和定義

struct Stu   //結構體的宣告,創建一個結構體型別
{
    char name[20];
    int age;
    char id[20];
}; 

struct Stu   //創建一個結構體型別
{
    char name[20];
    char author[15];
    float price;
}b1,b2; //創建兩個全域的結構體變數

struct Point   //創建一個結構體型別
{
    int x;
    int y;
}p1,p2; //創建兩個個全域的結構體變數 

int main()
{
    struct Stu b1;//創建一個區域的結構體變數
    struct Stu b2;//創建一個區域的結構體變數
    return 0;
}

以上兩種創建結構體變數的方式都是允許的,只不過再main中創建的結構體變數是存放在堆疊上的,而b1、b2、p1、p2是全域的結構體變數,全域變數是存放在靜態區的,注意創建一個結構體型別時分號不能丟

創建結構體的偷懶式寫法(簡潔版)

例如描述一個動物

typedef struct Animal  //創建一個結構體型別
{
    char families[20] // 描述動物科
    char skill[20] //動物技能
    char breed[20] //動物的繁殖方式
    
}Animal; 

int main()
{
    struct Animal tiger //創建一個老虎物件
    Animal mew  //創建一個海鷗物件
    return 0;
}

在主函式中使用以上兩種定義結構體變數的方式都可以,這里值得一提的是Animal是一個型別使用typedef給整個結構體型別取了一個別名叫Animal,簡單說明以下typedef關鍵字,這個關鍵字是給型別取別名的,比如int型別是一個整形,我也可以使用typedef給int型別取別名為intjj,此時的
intjj 表示的還是一個整形,未來在使用的時候intjj型別定義一個變數,這個變數就是一個整形

值得一提的是使用typedef定義出的新型別,只是一個型別而并不是一個變數,跟之前的在末尾定義結構體變數的意義是截然不同的,一種是宣告結構體型別的時候定義結構體變數,而第二種使用typedef只是給原先的結構體型別取別名

結構體變數定義初始化

為了便于大家理解還是采用之前的代碼

typedef struct Animal  //創建一個結構體型別
{
    char families[20] // 描述動物科
    char skill[20] //動物技能
    char breed[20] //動物的繁殖能力
    
}Animal; //結構體型別別名,表示的是同一種型別

int main()
{
    struct Animal tiger = {"貓科","捕獵","***"};
    Animal mew = {"歐科","飛翔","**"};
    return 0;
}

是不是非常簡單的初始化方式?沒錯

結構體嵌套

typedef struct birthday  //生日
{
	int year;//年
	int month;//月
	int day;//日

}birthday;

typedef struct Student  //學生
{
	int age;//年齡
	char name[20];//姓名
	birthday b1;
	char occupation[20];//職業



}Student;
int main()
{
	Student s1 = { 18,"張三",{2002,4,8},"經理", };//結構體嵌套初始化
	printf("%d %s %d %d %d %s",s1.age,s1.name,s1.b1.year,s1.b1.month,s1.b1.day,s1.occupation);
	return 0;
}

使用運算子訪問結構體成員

typedef struct birthday
{
	int year;
	int month;
	int day;

}birthday;

typedef struct Student
{
	int age;
	char name[20];
	birthday b1;
	char occupation[20];

	

}Student;
int main()
{
	Student s1 = { 18,"張三",{2002,4,8},"經理", };
	printf("%d %s %d %d %d %s\n",s1.age,s1.name,s1.b1.year,s1.b1.month,s1.b1.day,s1.occupation);

	Student *p = &s1;
	printf("%d %s %d %d %d %s\n", p->age,p->name,p->b1.year,p->b1.month,p->b1.day,p->occupation);
 
  	printf("%d %s %d %d %d %s\n", (*p).age, (*p).name, (*p).b1.year, (*p).b1.month, (*p).b1.day, (*p).occupation);
	return 0;
}

結構體變數傳參

1、值傳遞

2、地址傳遞

首先先看值傳遞

void print(Student s1)
{
	printf("%d %s %d %d %d %s\n", s1.age, s1.name, s1.b1.year, s1.b1.month, s1.b1.day, s1.occupation);
}
int main()
{
	Student s1 = { 18,"張三",{2002,4,8},"經理", };
	print(s1);
 
   return 0}

引數傳遞以值傳遞的方式,就是一次資料的拷貝(每次都會拷貝sizeof(結構體變數)),將實參s1拷貝到形參s1,值拷貝是會額外地分配一塊空間的(sizeof(結構體變數)),結構體變數的大小(位元組)一般來講都會比較大一些,如果每次都是以值拷貝的方式將實參的成員變數挨個拷貝至形參的成員變數,這對于運行效率和空間占用來講是會大大損耗的(不推薦),
解決方案:地址傳遞

地址傳遞

void print(Student *p)
{
	printf("%d %s %d %d %d %s\n", p->age, p->name, p->b1.year, p->b1.month, p->b1.day, p->occupation);
}
int main()
{
	Student s1 = { 18,"張三",{2002,4,8},"經理", };
	print(&s1);
 
   return 0}

但是如果是地址傳遞的話,那就不一樣了,因為指標的默認位元組數是看作業系統的,那如果是在32位平臺下的話,指標默認4位元組,每次都只需要傳遞一個地址過去,只占四位元組,極大地提升了效率,減少了空間的浪費

總結:地址傳遞效率更高

在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/292234.html

標籤:其他

上一篇:為了保護CSDN著作權,我用一行代碼就能給圖片加水印!

下一篇:CPU、MPU、MCU、SOC的概念與區別

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more