網站首頁 編程語言 正文
前言
本人在校學習的第一門語言是C++,由于操作系統這門課程實驗的需要,要求在linux下使用GCC編譯器編譯C程序代碼,為了寫代碼的方便,本人先采用VS2017寫了C++版本的代碼,再根據C++和C語言兩個語法的不同將程序進行修改成C程序。由于本人沒有學過C語言,對C語言的語法也不是很熟悉,寫本文的目的是記錄下修改過程的遇到的幾個注意點,方面以后參考,
1.頭文件
c++
#include <iostream> #include <ctime> #include <stdlib.h> #include <random>
C
#include <time.h> #include <stdlib.h> #include <sys/types.h> #include <sys/msg.h> #include <sys/ipc.h> #include <sys/wait.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <stdbool.h> #include <malloc.h>
注:以上兩種語言的頭文件沒有給出直接對應的關系,在使用時若不知道需要哪些頭文件可以直接全部復制使用。
2.結構體struct
C++?說明:?C++的struct成員包含成員函數
struct Hello{ void sayHello(char *name){ printf("你好,%s\n",name); } }; int main() { Hello hello; hello.sayHello(); exit(0); }
C?說明:?C語言的struct的成員只能是數據,不支持函數,因此若要定義結構體的函數需要使用函數指針實現
struct Hello{ void (*sayHello)(char* name); //函數名為指針類型 }; void sayHello(char* name){ printf("你好,%s\n",name); } int main(){ struct Hello hello; //聲明結構體的變量,需要加struct hello.sayHello=sayHello; //C語言需要使用函數指針指向函數的聲明?。。? hello.sayHello("淺若清風"); return 0; }
3.動態數組的創建與刪除
以一維和二維動態數組為例: C++?創建:?C++使用new
自動為動態數組分配空間?刪除:?C++使用delete為動態數組釋放內存
void f() { int n; int m; int *Array1; //聲明一維動態數組 Array1=new int(n); //為一維動態數組分配空間,元素個數為n int **Array2; //聲明二維動態數組 Array2=new int*[n]; //為二維動態數組分配空間(n個指針空間),n行 for(int i;i<n;++i) { Array2[i]=new int[m]; //為每一行分配內存空間(m個整數空間),m列 } //釋放內存 delete []Array1; for(int i=0;i<n;++i){ delete[]Array2[i]; } delete[]Array2; }
C?創建:?C使用calloc
為動態數組分配空間?刪除:?C使用free()為動態數組釋放內存
void f() { int n; int m; int *Array1; //聲明一維動態數組 Array1=(int *)calloc(n,sizeof(int)); //為一維動態數組分配空間,元素個數為n int **Array2; //聲明二維動態數組 Array2=(int **)calloc(n,sizeof(int*)); //為二維動態數組分配空間(n個指針空間),n行 for(int i;i<n;++i) { Array2[i]=(int*)calloc(m,sizeof(int)); //為每一行分配內存空間(m個整數空間),m列 } //釋放內存 free(Array1); for(int i=0;i<n;++i){ free(Array2[i]); } free(Array2); }
malloc函數與calloc函數的區別:
- malloc函數:不能初始化所分配的內存空間,在動態分配完內存后,里邊數據是隨機的垃圾數據。
- calloc函數:能初始化所分配的內存空間,在動態分配完內存后,自動初始化該內存空間為零。
4.函數順序問題
- C++中,寫在前面的函數可以直接調用寫在后面的函數
- C中,被調用的函數需要寫在調用函數之前
5.類(class)
類是C++引入的類型,可以包含數據,也可以包含函數,解決了C語言struct只能包含數據的缺陷。 另外一個不同點是struct是默認public,而class默認private
- 下面以一個鏈隊的例子,來體現C++的 class的用法,并與C語言用struct實現進行對比
C++
#include<iostream> using namespace std; class QueueNode //隊列結點 { public: QueueNode() :page(-1), next(NULL) {}; QueueNode(int m_page, QueueNode* m_next = NULL) :page(m_page), next(m_next) {}; ~QueueNode() { next = NULL; } public: int page; QueueNode* next; //儲存下一個結點的指針 }; class LinkQueue //隊列 { public: LinkQueue() { front = rear = new QueueNode(); count = 0; } void push(int m_page); //加到隊尾 int pop(); //取出隊首結點(此例是包含頭指針的鏈隊,頭指針的下一個結點才是隊首結點),并返回該結點值 bool exist(int page); //判斷隊列中是否有結點的值為page void print(int page); //打印隊列 QueueNode* front; //隊首指針 QueueNode* rear; //隊尾指針 int count; //統計結點數量 }; void LinkQueue::push(int m_page) { QueueNode* p = new QueueNode(m_page); p->next = NULL; rear->next = p; rear = p; count++; } int LinkQueue::pop() { if (front == rear) { printf("隊列為空!\n"); return 0; } int top = front->next->page; //記錄隊首,作為返回值 QueueNode* tmp = front->next; front->next = tmp->next; if (rear == tmp) //只剩下一個元素,此題不會出現這種情況 { rear = front; } delete tmp; count--; return top; } void LinkQueue::print() //打印隊列 { QueueNode* p = front; while (p->next != NULL) { printf("%d ", p->next->page); p = p->next; } printf("\n"); } bool LinkQueue::exist(int page) { //判斷隊列中是否存在元素page QueueNode*p = front; while (p->next != NULL) { if (p->next->page == page) { return true; } else { p = p->next; } } return false; } int main() { LinkQueue queue; for(int i=0;i<5;++i) { queue.push(i); } queue.print(); if(queue.exit(6)) printf("yes!\n"); else printf("no!\n"); int top=queue.pop(); //獲得隊首元素值 printf("隊首元素的值為%d\n",top); }
# include<stdio.h> # include<stdlib.h> # include<stdbool.h> struct QueueNode { int page; struct QueueNode *next; }; typedef struct LinkQueue { struct QueueNode* front; struct QueueNode* rear; int count; }; void initQueue(struct LinkQueue *q) { q->front = q->rear=(struct QueueNode *)malloc(sizeof(struct QueueNode)); q->front->next = NULL; q->count=0; } void push(struct LinkQueue *q, int page) { struct QueueNode* node = (struct QueueNode*)malloc(sizeof(struct QueueNode)); node->next = NULL; node->page = page; q->rear->next = node; //與新增結點鏈接 q->rear=node; //尾指針后移 q->count++; } int pop(struct LinkQueue*q) //隊首元素出隊,并返回數值 { int top = q->front->next->page; struct QueueNode *node = q->front->next; q->front->next = q->front->next->next; free(node); return top; } bool exist(struct LinkQueue*q, int page) //判斷隊列是否有結點的值等于page { struct QueueNode *node = q->front; while (node->next != NULL) { if (node->next->page == page) return true; else node = node->next; } return false; } void print(struct LinkQueue *q) { struct QueueNode *node =q->front; while (node->next != NULL) { printf("%d ", node->next->page); node = node->next; } printf("\n"); } int main() { struct LinkQueue queue; initQueue(&queue); for (int i = 1; i < 5; ++i) { push(&queue, i); } print(&queue); if (exist(&queue, 3)) printf("yes!\n"); printf("======\n"); if (exist(&queue, 6)) printf("yes!\n"); else printf("no!\n"); int top = pop(&queue); printf("隊首元素的值為%d\n", top); }
原文鏈接:https://juejin.cn/post/7085332375613210637
相關推薦
- 2022-04-24 淺析GBase8s?唯一索引與非唯一索引問題_數據庫其它
- 2022-07-01 Armbian5.9.0安裝docker及部署可視化portainer的詳細教程_docker
- 2022-10-17 Python可視化程序調用流程解析_python
- 2022-11-16 生產redisson延時隊列不消費問題排查解決_Redis
- 2023-04-14 python使用pyodbc連接sqlserver_python
- 2022-10-01 React?Hook中useState更新延遲問題及解決_React
- 2022-06-08 報錯:No fallback instance of type class**解決辦法
- 2022-03-28 用python實現一個文件搜索工具_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支