内容简介:又一本市圖借書,限時歸還,讀完不佔空間的課外讀物~上回寫Arduino 打卡鐘程式光研究 byte[] 轉成 16 進位字串就花了我一個小時,非常汗顏,C 語言的陣列跟指標一直是我的阿基里斯腱,每次只要看到 char*[] p、char[]* p、&p、**p 腦袋就打結。無意在圖書館看到這本快快樂樂系列,應是老天爺的安排,決定給自己機會雪恥。
又一本市圖借書,限時歸還,讀完不佔空間的課外讀物~
上回寫Arduino 打卡鐘程式光研究 byte[] 轉成 16 進位字串就花了我一個小時,非常汗顏,C 語言的陣列跟指標一直是我的阿基里斯腱,每次只要看到 char*[] p、char[]* p、&p、**p 腦袋就打結。無意在圖書館看到這本快快樂樂系列,應是老天爺的安排,決定給自己機會雪恥。
學電腦語言怎能不實機練習?用 Visual Studio 寫 C++ 體驗絕對是頭等艙等級,但過於笨重擁腫,來用 Visual Studio Code 好了。VSCode 寫 C 需要另外安裝編譯器軟體及套件,步驟稍多,但其輕巧敏捷還是值回票價。在網路找到這篇: 使用 VSCode 編譯並執行 C/C++ 語言 ,照方煎藥即可完成環境設定。
安裝、設定與使用重點摘要如下:
- 安裝 MinGW ( Min imalist G NU fro W indows,將 GCC 與 GNU Binutils 移植到 Windows 平台,比 Cygwin 輕巧效能好)
- 安裝 LLVM (編譯器基礎環境)
包含 Clang (發音為/ˈklæŋ/),為 C/C++/Objective-C 的編譯器前端,使用 LLVM 作為編譯器後端,目標在成為 GCC 替代品。 - 安裝編輯、編譯與執行所需的擴充套件:
- C/C++ (Intellisense 語法提示、偵錯)
- C/C++ Clang Command Adapter (提供 Clang語法自動完成)
- Code Runner (程式執行工具,直譯式語言甚至可選取特定程式碼按右鍵選單執行)
- 建立專案資料夾,在其下建立 .vscode 資料夾(以 . 起始的資料夾不能用檔案總管建立,需改用 DOS/Cmder 視窗 mkdir .vscode)
- 在 .vscode 放入 c_cpp_properties.json、launch.json、settings.json、tasks.json 等內容
- 專案資料夾右鍵選單執行「Open with code」或在命令列視窗執行
code .啟動 VSCode,開始在專案資料夾編輯 .c 或 .cpp 程式檔
- 按視窗右上的箭頭圖示執行:(按 Ctrl-Alt-N 亦可,但在我的電腦與 Evernote 快速鍵衝突)
- 可設中斷點、Line By Line 偵錯、滑鼠滑過時會顯示變數內容,偵錯功能強大,VSCode 不負 Visual Studio 的威名。
順利搞定開發環境,隨手附上我的指標與陣列程式練習範例,希望以後遇到 C 語言的指標不再手腳發軟:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void test1() {
//兩種陣列宣告方式
int a1[4] = {1, 2, 3, 4};
int a2[] = {1, 2, 3, 4};
//字串
char s1[] = "ABC";
//記得尾端要放\0
char s2[4] = {'A', 'B', 'C', '\0'};
}
void test2() {
char s1[] = "ABC";
//字串函式,需#include <string.h>
//取得字串長度
int l = strlen(s1);
//複製字串
char s2[6]; //需預先算好長度
strcpy(s2, "Hello");
//字串相接
char s3[6] = "ABC"; //需預留串接後長度
char s4[] = "DE";
strcat(s3, s4);
//字串比較
char s5[] = "ABC";
char s6[] = "ABCD";
int c = strcmp(s5, s6);
//s5==s6時c為0, s5<s6時c<0,s5>s6時c>0
//數值轉字串
char s7[40];
sprintf(s7, "%f", 3.1416);
//字串轉數值
char s8[] = "32767";
int n = atoi(s8);
}
void test3() {
//指標的兩種宣告寫法
char* p1;
char *p2;
char a = 'A';
p1 = &a; //指派位址
printf("%c", *p1); //指向變數內容時寫*p
//明確表示不指向任何地方時,用NULL
char *p3 = NULL;
//檢查是否為空 if (p != NULL), if (!p)
}
void test4() {
//指標與陣列
int a[4] = {1, 2, 3, 4};
int *i = a + 1;
printf("*i=%d\n", *i); //得到2
//加1並不是移動一個Byte,而是一個int的長度(sizeof(int))
printf("*(i+1)=%d\n", *(i+1)); //得到3
//i++亦可向後移一個元素
i++;
printf("*i=%d after i++\n", *i);
}
void test5() {
//動態配置記憶體
short *buf;
//相當於宣告1000個short陣列
buf = (short *)malloc(sizeof(short) * 1000);
buf[20] = 40;
printf("%d\n", buf[20]);
//使用完要記得釋放(沒有GC幫忙,一切自己來)
free(buf);
//calloc初始化並設為0
buf = (short *)calloc(100, sizeof(short));
printf("%d\n", buf[5]);
//realloc重新配置大小
buf = (short *)realloc(buf, sizeof(short) * 10);
}
void test6() {
char *b;
char a[4] = {1, 2, 3, 4};
b = (char *)malloc(sizeof(char) * 200);
if (!b)
return; //無法配置記憶體時不繼續,以後Crash
memcpy(b, a, sizeof(char) * 4);
printf("%d\n", b[2]); //得到3
free(b);
//另外有memset(buff, value, count)從buff位址填入count個value
}
int main() {
test6();
return 0;
}
Notes of installing WinGW, LLVM and VSCode packages on Windows to write C program.
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- RecyclerView使用指南(一)—— 基本使用
- 如何使用Meteorjs使用URL参数
- 使用 defer 还是不使用 defer?
- 使用 Typescript 加强 Vuex 使用体验
- [译] 何时使用 Rust?何时使用 Go?
- UDP协议的正确使用场合(谨慎使用)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
从需求到产品:0岁产品经理进阶之道
权莉 / 人民邮电出版社 / 2018-7 / 49.80元
本书主要针对刚入职的初级产品经理,从贴近工作状态的场景切入,对各阶段的知识点进行分类总结,旨在提供一套经过实践检验的产品方法论,为读者从初级产品经理成长为产品经理奠定坚实的基础。 书中提炼的方法和案例涵盖初级产品经理工作的方方面面,从基本技能到思维方式,从需求管理到产品规划定义,从框架选型到流程梳理,从工作模块拆解到案例剖析,用具体且贴合实际工作场景的内容,还原真实的产品工作方法及实践案例,既有方......一起来看看 《从需求到产品:0岁产品经理进阶之道》 这本书的介绍吧!