一篇關於c語言的大補帖

来源:https://www.cnblogs.com/assassinx/archive/2022/04/23/15915892.html
-Advertisement-
Play Games

一晃今年又開始了,作為一個失意的中年技術男,現在的心境真的是五味雜陳。趕緊寫一篇吧,我怕過了這個點,今年就在沒有那個心情去寫了。 因為是基礎嘛,從事軟體開發以來c或者c++相關的東西斷斷續續 也刷了差不多一遍。中間看的書差不多有 c++游戲編程入門教程,vc++深入詳解, c++ primer pl ...


一晃今年又開始了,作為一個失意的中年技術男,現在的心境真的是五味雜陳。趕緊寫一篇吧,我怕過了這個點,今年就在沒有那個心情去寫了。

因為是基礎嘛,從事軟體開發以來c或者c++相關的東西斷斷續續 也刷了差不多一遍。中間看的書差不多有 c++游戲編程入門教程,vc++深入詳解, c++ primer plus ,c程式設計語言。

 

c語言和c++以及一些其它高級語言的區別

與其它語言相比c++是一個開放式的開源的所謂的眾人拾柴火焰高的解決方式,只規定了基本的語法和約定 各種其他,比如編譯器都由各個廠商自己去實現 比如多線程沒有  各種只要跟操作系統介面相關的  那麼說白了還是不能跨平臺的 所謂的跨平臺只是說這個基本語法和格式約定 在各個平臺編譯大差不差。實際上這個眾人拾柴還是火焰沒高起來 。不如微軟c#那種一攬子方案來得舒服。然後說說c++與純c,純c裡面並不支持string 也不支持include<string> 可以說是刀耕火種的地步了 ,std庫不用說更是不支持。其實想想c++已經算是比較高級方便的了 。說歸說 接觸了c51  msp430 stm32 還是能夠發現一些端倪的 ,從最初引導晶元進入首條指令執行的那幾句彙編 為萌芽 到後面不斷的喂指令 不斷的迴圈 地址偏移 ,跳轉 判斷, 開啟了 後面以軟體為主題的這個學科  編程嘛 條件判斷嘛 記憶體嘛 數據嘛   進程嘛  巴拉巴拉,像極了世界的一生二二生三三生萬物,人類在晶元上運行程式進行流程式控制制 電腦最基礎的雛形 關鍵之處 也在於此,彙編或者c語言正符合這種最初級的需求,你會發現原來這就是所謂的裸機編程 並沒有操作系統上層一堆的東西參與也沒有庫,一切都是刀耕火種 ,不是說它多麼的高深多麼難 其實就是這麼的純粹而已。 但是基於它的這種直接記憶體控制的高效機制 所以做底層演算法的 大多還是用C++這玩意兒。對於初學者某些東西如果開始選擇難的如果弄不出來是很容易消磨人的意志的 ,作為普通人誰不想拖拖滑鼠就能做出來功能呢。還有所謂的動態記憶體分配,在c++里所謂的動態記憶體分配概念就是一個函數大括弧下來裡面運行的東西叫自動變數 放在棧上 ,括弧結束即從棧上清除掉,動態記憶體就僅是指new出來的東西 方法運行結束了還沒消失的東西,搞了單片機那一套後才發現  也就幾百行的程式就算大程式了 並且也根本用不上所謂的動態記憶體分配 ,根據cpu的時鐘頻率 ,簡單粗暴的的單線程迴圈 代表cpu的一個運轉周期 ,恍然覺得最簡單的編程原來可不就是這樣嗎,值處理和指針 有那麼一點奇技淫巧存在。

一些基本上手

純c嘛,萬事當然從printf開始,來一段printf基本操作

 1 void PrintTest(){
 2         int a = 23;
 3         //列印一個整數 ,註意這裡有陷阱哈 ,如果是一個浮點數35.1並不會輸出35 而是0
 4         printf("%d\n", a);        
 5             
 6         //純c裡面並不支持string 也不支持include<string>
 7         //string str1("sdfdfdf33444");
 8         //純c列印字元串
 9         char * str1 = "nihao\0";
10         printf("%s\n", str1);
11         //運算任意一側有浮點數 運算之前整數操作會被轉為浮點數    
12         printf("%f\n", 5.0 / 9);
13         printf("%3.2f\n", 643.1415926);
14         //%02X 格式化為16進位 比如0x05 不足2位的前面會以0補齊
15         printf("%02X\n", 5);
16         printf("Hello world!\n");        
17 }

 

用慣了高級語言 新手老是說不就是輸出個字元串嗎 c怎麼這麼麻煩,咋個又不對了,所謂萬事開頭難,然後是人類編程流程式控制制最基礎的 數字 文本轉換了 ,還有文本的格式化 ,對不對 ,有木有。

 

 1 void PrintTest2(){
 2 
 3     //純c裡面利用sprintf_s實現類似stringFormat的效果
 4     //標準c里是支持sprintf的 ,vc裡面不支持 使用sprintf_s作為替代
 5     int a = 23;
 6     char buff[8] = { 0 };
 7     sprintf_s(buff, "%d個\0", a);
 8     printf("%s\n", buff);
 9 
10     //c語言中的字元串拼接
11     //str1+str2; c語言里並不能這樣
12     //字元串數組方式
13     char  str1[] = "hello ";//可以換成 char * str1=
14     char  str2[] = "world";//可以換成 char * str2=
15     char  str3[20] = "";//這個不能換
16     strcat_s(str3, str1);//strcat_s也是作為strcat的替代
17     strcat_s(str3, str2);
18     printf("%s\n", str3);
19 
20     //數字轉字元串
21     int num = 4568;
22     char number[15];
23     _itoa_s(num, number, 10);//_itoa_s也是作為itoa的替代
24     printf("%s\n", number);
25     //字元串轉數字
26     char * number2 = "8957";
27     int number33;
28     number33=atoi(number2);
29     printf("parse Int :%d\n", number33);
30 
31     //上面的兩種都可以用下麵的解決方案
32     //但是註意str5必須要先分配固定記憶體,也不能使用char
33     char * str4 = "hello\0";
34     int num1 = 6749;
35     char str5[20];
36     sprintf_s(str5, "%s - %d", str4, num1);
37     printf("%s", str5);
38 
39 }

 

然後c語言的一些基礎的,比如函數體內的變數 在函數結束前銷毀稱之為自動變數,基本的變數賦值 表達式運算條件判斷 。函數每次運行互相獨立的 ,這些不用多說了吧。 註意上面代碼的註釋vc裡面的某些函數跟標準c有一些出入 ,但是區別不大。註意sprintf的使用可以實現一些靈活的格式化字元串效果。然後你會發現c都是最基礎的位元組和地址操作 ,深入思考後如果你願意上面類似的字元轉數字函數你可以自己寫一個 可不就是每個位元組ascii碼比對然後轉換成二進位位嗎,高級語言字元串 是怎麼封裝來的 ,單片機里的指令  記憶體 數據 ,c太原始了 由不得 你不去思考 它的本質了。c里的數組   地址偏移  指針 幾個東西總是左右游走 亦數組亦指針 模棱兩可,深入理解後你就會發現指針 包括高級語言的.點操作符 本質就是地址偏移 數組可以理解為一組連續偏移的變數。有時候通過這種機制實現靈活的記憶體操作 以及利用一些奇技淫巧實現一些高效的位操作,這既是純c被人詬病的地方,也是它優勢的地方 看你怎麼理解咯。總之一句話就是 根據記憶體地址進行記憶體數據操作。基於以上 所以c++很大一部分都是在講動態記憶體分配,c很大一部分是在講位操作和指針。上代碼: 

玩出花的指針:

 1 void PointerVoidTest(){
 2     //指針也要確定數據類型 才能輸出它本來的值 ,這裡有一點技巧 void指針可以跟其它指針轉換
 3     int * pi1;
 4     int nn1 = 762;
 5     void * pv1;
 6     pv1 = &nn1;
 7     //void指針轉換的正確例子 ,(int *) 僅僅時轉換成了一個int指針 前面還要加* 才輸出本來的數
 8     printf("%d aa", *(int *)pv1);
 9 }
10 void PointerTest(){
11     //我們平常編程寫的字元常量"aaa" 這種的 或者參數 也是一種預分配記憶體形式的指針
12 
13     //指針地址也可以進行比較== 類似於意思看是不是同一個引用
14 
15     //c語言中地址算術運算是一致且又規律的 講指針數組 和地址的算術運算集成在一起是該語言的一大優點
16     //函數定義中 char*s 和char s[] 是等價的
17 
18     int a1[3][5];
19     int *b[10];
20     //對於C語言的初學者來說,很容易混淆二維數組與指針數組之間的區別,比如上面例子中
21     //int a[3][5]; 是一種正規數組做法
22     //int *b[10]  是一個10元素的數組 每個元素是一個int指針,還必須初始化每個指針的指向
23     //才是一個二維數組 ,比第一種的優勢是 每個元素可以指向長短不一的數組 比如字元串應用
24     //指針數組
25     char * mname[] = { "illegal month", "jan", "feb", "mar" };
26     //二維數組 除第一維以外其他維必須指明長度
27     char  mname2[][15] = { "illegal month", "jan", "feb", "mar" };
28 
29     int ar[] = { 4, 5, 7, 6 };
30     int * pa;
31     pa = ar;//等同於    pa=&ar[0];
32     printf("%d--\n", *(pa + 1));//等同於ar[1] 註意這個微秒的區別 地址偏移
33     //*(pa+i) 為對應數組下標i的值
34     printf("%d--\n", *(ar + 1));//同樣等同於 ar[1]
35     printf("%d--\n", pa[1]);
36     //看指針和數組偏移量 指針玩出花兒來
37     //p++ 如果是int那麼地址也會增加對應的int類型位元組長度  p89頁
38     //void* 一種通用指針
39     //指針是能夠存放一個地址的一組存儲單元 通常是4位元組
40     //指針還要確認他指向什麼  以便知道長度 和後續操作 int *  代表指向int的指針
41     //&是取地址符 ,取變數對象的地址
42     //並不是說用了指針就等於動態記憶體分配 maloc new 那些才算,其實單片機編程中很少動態記憶體分配
43     //一元運算符*是簡介定址或簡介引用運算符 當他用於指針時 將訪問指針所指向的對象
44 
45     //c語言的類型 數組 聲明的首碼的組合非常靈活
46     int x = 1, y = 2, z[10];
47     int *ip;
48     ip = &x;//現在ip指向x
49     y = *ip;//現在y=1;
50     //ip=&z[0];//現在IP只想z[0]  //傳數組變數其實是一種變相的方式
51     (*ip)++;//圓括弧是必須的 否則 對地址進行+1運算
52     printf("%d--\n", *ip);
53 
54     z[0] = 5;
55     z[1] = 8;
56     ip = &z[0];
57     *(ip++);
58     printf("%d--\n", *ip);
59 
60     //把一個指針複製給另一個指針
61     //指針也是變數 就是一個地址 直接使用 而不必使用間接引用符&
62     int *iq;
63     iq = ip;
64     printf("%d--\n", *iq);
65 
66     printf("%d--\n", iq);//指針變數保存的地址 可以發現跟printf("%d--\n", ip);是一樣的
67     printf("%d--\n", &iq);//而這個變數本身又保存在那個地址?
68 
69     printf("------------------------------\n");
70     *(&iq) = 0;//
71     printf("%d++\n", z[1]);
72     printf("%d--\n", iq);//指針指向的地址變為0
73     //現在已經是一個野指針 出來的int是不知道是什麼值的,嚴重時程式會崩潰
74     //printf("%d--\n", *iq);
75     printf("%d--\n", &iq);//指針變數本身的地址依然客觀存在
76 }

高階的指針數組 地址偏移量操作本質 以及void指針類型轉換 

接下來是一個二維數組和指針相結合操作的例子:

 1 void reIniAr2(int *b[])//unsigned short*a[],
 2 {
 3     for (int i = 0; i<2; i++){
 4         for (int j = 0; j<2; j++){
 5             //b[i][j] = 666;
 6             *(*(b + i) + j) = 444;
 7         }
 8     }
 9 }
10 void arr2dTest(){    
11     //數組已經聲明後 不用想這種歪門子再去整體賦值 ,無論咋個都是不行的,必須的老老實實一個一個重新賦值
12     //然後另外一個c的數組長度並不允許通過變數確定 必須通過define 或者常量確定,
13     //網上評論說c99編譯可以 int alen=3;int ar[alen]
14     //fqTab=&fqTab2;
15     //指針方式的2維數組處理
16     int a1[] = { 786, 894 };
17     int b1[] = { 377, 945 };
18     //這種方式是都支持的 兩個一維數組地址 結合成指針形式的二維數組
19     int * ar[] = { &a1[0], &b1[0] };
20     //這種方式codeblocks只是不會報錯 但是後續操作會有莫名問題  vs2013直接不支持
21     //int * ar[] = { {1,2}, {3,4} };
22     //*(*(ar + 1) + 0) = 444;
23     reIniAr2(ar);
24     //ar[0][0] = 555; 既可以通過這種方式訪問元素,也可以通過下麵這種地址偏移方式訪問
25     //但是下麵這種理解起來需要花一番功夫     
26     printf("%d--bb\n", *(*(ar + 0) + 0));
27     //但是由這種過度呢 *號代表取指針指向的本來的東西
28     printf("%d--bb\n", *(ar + 0)[0]);
29 
30     //當然下麵才是一種簡便 正常數組的用法,上面的不強求
31     int a2[2][2] = {0};
32     a2[0][0] = 734;
33     a2[0][1] = 841;
34     printf("%d--b2\n", a2[0][0]);
35     printf("%d--b2\n", a2[0][1]);
36 }

然後是一個二維數組操作的示例,註意通過傳遞void類型的指針 ,我們卻把當成 unsigned short類型進行解析 以及地址偏移的技巧i*2是因為short占2位元組

 1 void OffSetDataReplaceFqTab(int adstart, int adcount, char * fqSegment)
 2 {
 3     for (int i = 0; i < adcount; i++)
 4     {
 5         int offsetStart = adstart + i - 10;
 6         // "/"取高位 "%"取低位  c語言的常規套路 這裡的使用也是這個理念
 7         int iOffset = offsetStart / 11;//行偏移
 8         int jOffset = offsetStart % 11;//列偏移
 9         //低索引是高位
10         //unsigned short beadd = (((char)(fqSegment[i * 2]))<<8) | (char)(fqSegment[i * 2+1]);
11         //這樣也是對的
12         //以前沒寫對因為沒有深刻理解fqSegment[i] 就是代表那個元素&fqSegment[i]才是地址
13         //(unsigned short *) 只是轉換成了指針 前面還要再加*
14         //當然轉換成usigned short的過程也是根據我們常見電腦系統來的也就是Intel的little位元組序
15         //低索引是低位 高索引是高位
16         //數組相當於連續定義的指針
17         //基本理念上就跟嵌入式視頻c語言地址賦值的那個地方一致
18         //unsigned short beadd = *(unsigned short *)&fqSegment[i*2];
19         unsigned short beadd = *(unsigned short *)(fqSegment+(i*2));
20         fqTab[iOffset][jOffset] = beadd;
21     }
22 }
23 
24 char  pia[10] =
25 {
26     0x01, 0x01,
27     0xff, 0xff,
28     0x01, 0x01,
29     0, 3,
30     0, 4 };
31 OffSetDataReplaceFqTab(21, 5, &pia[0]);

然後是另一個void類型指針轉換的例子

1 void PointerVoidTest(){
2     //指針也要確定數據類型 才能輸出它本來的值 ,這裡有一點技巧 void指針可以跟其它指針轉換
3     int * pi1;
4     int nn1 = 762;
5     void * pv1;
6     pv1 = &nn1;
7     //void指針轉換的正確例子 ,(int *) 僅僅時轉換成了一個int指針 前面還要加* 才輸出本來的數
8     printf("%d aa", *(int *)pv1);
9 }

 

函數指針(又叫委托 或者回調方法  巴拉巴拉)

接下來是函數指針 的用法 ,我們最開始得弄兩個參數一樣的方法 作為同等級調用區分示例 對吧

 1 //函數指針簡單使用 概念類似c#的委托
 2 int method1(int a){
 3     printf("method11:%d\n",a);
 4     return 0;
 5 }
 6 
 7 int method2(int a){
 8     printf("method22:%d\n",a);
 9     return 0;
10 }

然後是調用套路,普通的形參定義 void method1(int a) ,這裡int a  就代表形參了。當參數是函數委托的時候 int(*delegate)(int ) 就成了函數指針, *號括弧後面再括弧 就認為是方法引用,不要問為什麼 ,就這麼不講道理 姑且死記硬背吧。

1 void calback1(int(*delegate)(int ))//接受返回一個int的函數委托
2 {
3     int a = delegate(3);
4     printf("a=%d--\n", a);
5 }
6 calback1(method2);

手持表裡面一種函數指針的用法

 1 //定義委托 接受int形參 返回int的方法
 2 typedef int (del)( int);
 3 
 4 //委托數組
 5 del *ds[] = {
 6     method1,
 7     method2
 8 };
 9 //調用委托數組元素進行執行
10 //以前只知道數組元素可以通過索引取出,沒聽說過元素還能“執行”真是神奇
11 ds[0](555);
12 ds[1](777);

 

枚舉和結構體

定義

 1 //枚舉統一聲明方式 別忘了typedef
 2 typedef enum
 3 {
 4     one,
 5     two,
 6     three,
 7 }  num;
 8 
 9 //結構體的統一聲明方式 //別忘了typedef
10 //typedef 類型定義
11 typedef struct
12 {
13     int x;
14     int y;
15 } pp;
16 //typedef int numb1; //typedef char*string ; 書上說標準庫的string就是這麼來的
17 //c語言的理念是一個處處能找到源頭的東西的 ,只要你想深挖
18 //還有一些基本常識,='A'與=65 在編譯器級別 是一樣的沒區別
19 //int cr ='A';//cr=65
20 
21 //位欄位
22 struct
23 {
24     unsigned int is_keyword : 1;//關鍵點就在於這個 :1 嗎?
25     unsigned int is_extern : 1;
26     unsigned int is_static : 1;
27 } flags;

 

 

結構體調用測試,還有以前面試的時候被問題及sizeof 問題的時候還以為 c內部有什麼封裝 ,到頭來發現也就是結構體內所有元素數據類型加起來的總長度而已,還有個新鮮的可能是以前沒有接觸過的那就是位欄位操作,在單片機上使用很適合

 1 void strAndEnumTest(){
 2     //枚舉測試
 3     num n1 = one;
 4     num n2 = two;
 5 
 6     if (n2 == two)
 7         printf("ok--a\n");
 8 
 9     printf("%d--a\n", sizeof(pp));//pp結構體里有兩個int 輸出8
10     //結構體 ,指針的訪問方式 ->箭頭運算符
11     //struct pp p3={1,3};
12     pp p2 = { 5, 8 }; //c的結構有點數組的味道,跟c#不一樣 註意不要寫成{ x=5,y=8}
13     //c語言和c++中的很多時候 初始化 沒有new xxx 這樣的,不像c#
14     //就是類指針和實例 的概念 習慣一下就好了
15     pp * p1;
16     p1 = &p2;
17     p1->x = 2;//等價 (*p1).x
18     
19     //struct pp or1,*p3   //c的聲明組合真的非常靈活
20     printf("%d--\n", p1->x);
21     printf(	   

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

-Advertisement-
Play Games
更多相關文章
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 1. new操作符的實現原理 new操作符的執行過程: (1)首先創建了一個新的空對象 (2)設置原型,將對象的原型設置為函數的 prototype 對象。 (3)讓函數的 this 指向這個對象,執行構造函數的代碼(為這個新對象添加屬性 ...
  • 參考資料 https://www.zhangxinxu.com/wordpress/2017/12/understand-svg-fedisplacementmap-filter/ 該文章已經講的特別細緻了,該篇僅以此記錄動效過程中各點的計算。 feDisplacementMap feDisplac ...
  • 一.同源策略問題(本地調試解決方案) firefox瀏覽器 地址欄輸入:about:config 搜索security.fileuri.strict_origin_policy(這個是安全文件同源策略限制),設置為false 重啟瀏覽器 chome瀏覽器 C盤下創建一個文件夾,名稱隨意(chrome ...
  • 大家好,我是半夏👴,一個剛剛開始寫文的沙雕程式員.如果喜歡我的文章,可以關註➕ 點贊 👍 加我微信:frontendpicker,一起學習交流前端,成為更優秀的工程師~關註公眾號:搞前端的半夏,瞭解更多前端知識! 點我探索新世界! 原文鏈接 ==>http://sylblog.xin/archi ...
  • 之前的文章已經介紹瞭如何實現Web端的即時通訊IM,為了讓大家全面的體驗通信互動的快樂。 本文介紹如何使用 ZIM SDK 快速實現實現小程式端的基本的消息收發功能,在微信中實現一個mini版微信,也就是常見的聊天功能。 ...
  • ###裝飾器模式 裝飾器模式(Decorator Pattern)允許向一個現有的對象添加新的功能,同時又不改變其結構。這種類型的設計模式屬於結構型模式,它是作為現有的類的一個包裝。 這種模式創建了一個裝飾類,用來包裝原有的類,併在保持類方法簽名完整性的前提下,提供了額外的功能。 我們通過下麵的實例 ...
  • 網頁端微信掃碼支付流程 1. 用戶在網頁上選擇“微信支付” 2. 用戶輸入充值金額,點擊“確定”操作 3. 網頁根據微信通道返回的支付鏈接生成微信支付碼 4. 用戶通過手機掃碼支付 5. 網頁根據用戶付款結果,進行跳轉或提示。 如下是一個產品交互原型,便於直觀理解。 再介紹一下網頁端微信掃碼支付的時 ...
  • Mybatis系列目標:從入門開始開始掌握一個高級開發所需要的Mybatis技能。 這是mybatis系列第10篇,源碼位於文章尾部! mybatis中一個比較強大的功能就是動態sql,記得在剛開始工作那會,當時使用jdbc開發系統,在java代碼中搞了很多判斷去拼接sql,代碼看起來比較亂,也不方 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...