QT實(shí)現(xiàn)串口通信的完整步驟
要實(shí)現(xiàn)串口通信,需要知道串口通信需要的信息
主要參數(shù)有:波特率、校驗(yàn)位、數(shù)據(jù)位、停止位、控制流
主要操作有:串口的打開和關(guān)閉、刷新設(shè)備串口、接發(fā)數(shù)據(jù)、開關(guān)顯示燈等。
實(shí)現(xiàn)效果如圖:
界面設(shè)計(jì)如下:
每個控件類名如下:
LED燈是QLable控件,設(shè)置它的長寬都是24px,然后鼠標(biāo)右擊,選擇“樣式表”,在樣式表中添加代碼。
最后附贈完整源碼
第一步:在頭文件中引入 QtSerialPort 類的兩個頭文件(必須引入)
// 引入串口通信的兩個頭文件(第一步) #include <QtSerialPort/QSerialPort> // 提供訪問串口的功能 #include <QtSerialPort/QSerialPortInfo> // 提供系統(tǒng)中存在的串口信息
第二步:在工程文件中添加以下代碼
# 引入串口工程類型(第二步) QT += serialport
第三步:在頭文件中定義全局的串口對象
QSerialPort *serial; // 定義全局的串口對象(第三步)
第四步:參數(shù)設(shè)置,在頭文件中定義初始化參數(shù)的函數(shù)和參數(shù)變量名,在.cpp文件中實(shí)現(xiàn)函數(shù)
public: void SerialPortInit(); // 串口初始化(參數(shù)配置) private: // 參數(shù)配置 QStringList baudList; //波特率 QStringList parityList; //校驗(yàn)位 QStringList dataBitsList; //數(shù)據(jù)位 QStringList stopBitsList; //停止位 QStringList flowControlList; //控制流
// 串口初始化(參數(shù)配置) void MainWindow::SerialPortInit() { serial = new QSerialPort; //申請內(nèi)存,并設(shè)置父對象 // 獲取計(jì)算機(jī)中有效的端口號,然后將端口號的名稱給端口選擇控件 foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts()) { serial->setPort(info); // 在對象中設(shè)置串口 if(serial->open(QIODevice::ReadWrite)) // 以讀寫方式打開串口 { ui->PortBox->addItem(info.portName()); // 添加計(jì)算機(jī)中的端口 serial->close(); // 關(guān)閉 } else { qDebug() << "串口打開失敗,請重試"; } } // 參數(shù)配置 // 波特率,波特率默認(rèn)選擇57600 ,禁止用戶點(diǎn)擊 ui->BaudBox->addItem("57600"); serial->setBaudRate(QSerialPort::Baud57600); ui->BaudBox->setDisabled(true); // 校驗(yàn),校驗(yàn)?zāi)J(rèn)選擇無 ui->ParityBox->addItem("無"); serial->setParity(QSerialPort::NoParity); // 數(shù)據(jù)位,數(shù)據(jù)位默認(rèn)選擇8位 ui->BitBox->addItem("8"); serial->setDataBits(QSerialPort::Data8); // 停止位,停止位默認(rèn)選擇1位 ui->StopBox->addItem("1"); serial->setStopBits(QSerialPort::OneStop); // 控制流,默認(rèn)選擇無 ui->ControlBox->addItem("無"); serial->setFlowControl(QSerialPort::NoFlowControl); // 刷新串口 RefreshSerialPort(0); // 信號 connect(serial,&QSerialPort::readyRead,this,&MainWindow::DataReceived); // 接收數(shù)據(jù) connect(ui->SendWordOrder,&QPushButton::clicked,this,&MainWindow::DataSend); // 發(fā)送數(shù)據(jù) connect(ui->SendButton,&QPushButton::clicked,this,&MainWindow::DataSend); // 發(fā)送數(shù)據(jù) connect(ui->SendEditBtn1,&QPushButton::clicked,this,&MainWindow::DataSend); // 發(fā)送數(shù)據(jù) connect(ui->SendEditBtn2,&QPushButton::clicked,this,&MainWindow::DataSend); // 發(fā)送數(shù)據(jù) connect(ui->SendEditBtn3,&QPushButton::clicked,this,&MainWindow::DataSend); // 發(fā)送數(shù)據(jù) }
第五步:刷新串口,及時更新可用的串口
// 刷新串口 void MainWindow::RefreshSerialPort(int index) { QStringList portNameList; // 存儲所有串口名 if(index != 0) { serial->setPortName(ui->PortBox->currentText()); //設(shè)置串口號 } else { ui->PortBox->clear(); //關(guān)閉串口號 ui->PortBox->addItem("刷新"); //添加刷新 foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts()) //添加新串口 { portNameList.append(info.portName()); } ui->PortBox->addItems(portNameList); ui->PortBox->setCurrentIndex(1); // 當(dāng)前串口號為COM1 serial->setPortName(ui->PortBox->currentText()); //設(shè)置串口號 } }
第六步:發(fā)送數(shù)據(jù)和接收數(shù)據(jù)
// 接收數(shù)據(jù),使用read () / readLine () / readAll () void MainWindow::DataReceived() { char BUF[512] = {0}; // 存儲轉(zhuǎn)換類型后的數(shù)據(jù) QByteArray data = serial->readAll(); // 讀取數(shù)據(jù) if(!data.isEmpty()) // 接收到數(shù)據(jù) { QString str = ui->DataReceived->toPlainText(); // 返回純文本 str += tr(data); // 數(shù)據(jù)是一行一行傳送的,要保存所有數(shù)據(jù) ui->DataReceived->clear(); // 清空之前的數(shù)據(jù) ui->DataReceived->append(str); // 將數(shù)據(jù)放入控件中 qDebug() << "str info: " << ui->DataReceived->toPlainText(); // 清除之前的數(shù)據(jù),防止追加,因?yàn)槊看潍@取的數(shù)據(jù)不一樣 int index = str.indexOf("\r\n"); // 找到,返回索引值,找不到,返回-1 if(index != -1) { snprintf(BUF,500,"%s", str.left(index + 2).toUtf8().data()); // QString轉(zhuǎn)為char * 類型 qDebug() << "BUF info: " << BUF; // 數(shù)據(jù)類型轉(zhuǎn)換成功 str.remove(0,index + 2); // 處理獲取到的數(shù)據(jù),將其放入對應(yīng)的控件中 // ..... } } } // 發(fā)送數(shù)據(jù),write () void MainWindow::DataSend() { serial->write(ui->DataSend->toPlainText().toLatin1()); // 串口發(fā)送數(shù)據(jù) }
第七步:打開串口和關(guān)閉串口,當(dāng)打開串口后,顯示綠燈;關(guān)閉串口后,顯示紅燈
// 串口開關(guān) void MainWindow::on_OpenSerialButton_clicked() { if(serial->isOpen()) // 如果串口打開了,先給他關(guān)閉 { serial->clear(); serial->close(); // 關(guān)閉狀態(tài),按鈕顯示“打開串口” ui->OpenSerialButton->setText("打開串口"); // 關(guān)閉狀態(tài),允許用戶操作 ui->BaudBox->setDisabled(false); ui->ParityBox->setDisabled(false); ui->BitBox->setDisabled(false); ui->StopBox->setDisabled(false); ui->ControlBox->setDisabled(false); // 禁止操作“發(fā)送字符操作” ui->SendWordOrder->setDisabled(true); ui->SendButton->setDisabled(true); // 關(guān)閉狀態(tài),顏色為綠色 ui->OpenSerialButton->setStyleSheet("color: green;"); // 關(guān)閉,顯示燈為紅色 LED(true); // 清空數(shù)據(jù) ui->DataReceived->clear(); ui->DataSend->clear(); } else // 如果串口關(guān)閉了,先給他打開 { //當(dāng)前選擇的串口名字 serial->setPortName(ui->PortBox->currentText()); //用ReadWrite 的模式嘗試打開串口,無法收發(fā)數(shù)據(jù)時,發(fā)出警告 if(!serial->open(QIODevice::ReadWrite)) { QMessageBox::warning(this,tr("提示"),tr("串口打開失敗!"),QMessageBox::Ok); return; } // 打開狀態(tài),按鈕顯示“關(guān)閉串口” ui->OpenSerialButton->setText("關(guān)閉串口"); // 打開狀態(tài),禁止用戶操作 ui->BaudBox->setDisabled(true); ui->ParityBox->setDisabled(true); ui->BitBox->setDisabled(true); ui->StopBox->setDisabled(true); ui->ControlBox->setDisabled(true); // 允許操作“發(fā)送字符操作” ui->SendWordOrder->setDisabled(false); ui->SendButton->setDisabled(false); // 打開狀態(tài),顏色為紅色 ui->OpenSerialButton->setStyleSheet("color: red;"); // 打開,顯示燈為綠色 LED(false); } } // 開關(guān)顯示燈 void MainWindow::LED(bool changeColor) { if(changeColor == false) { // 顯示綠色 ui->LED->setStyleSheet("background-color: qradialgradient(spread:pad, cx:0.5, cy:0.5, radius:0.5, fx:0.5, fy:0.5, stop:0 rgba(0, 229, 0, 255), stop:1 rgba(255, 255, 255, 255));border-radius:12px;"); } else { // 顯示紅色 ui->LED->setStyleSheet("background-color: qradialgradient(spread:pad, cx:0.5, cy:0.5, radius:0.5, fx:0.5, fy:0.5, stop:0 rgba(255, 0, 0, 255), stop:1 rgba(255, 255, 255, 255));border-radius:12px;"); } }
第八步:相關(guān)槽函數(shù)
// 控件中添加 指令“###” void MainWindow::on_SendButton_clicked() { on_ClearButton_clicked(); ui->DataSend->append("###"); } // 清空控件 void MainWindow::on_ClearButton_clicked() { ui->DataSend->setText(""); } // 清空接收到的數(shù)據(jù) void MainWindow::on_ClearShowButton_clicked() { ui->DataReceived->setText(""); } // 點(diǎn)擊發(fā)送后,獲取串口信息并展示在接受控件中 void MainWindow::on_SendEditBtn1_clicked() { on_ClearButton_clicked(); QString EditText = ui->Edit1->text(); //獲取發(fā)送框內(nèi)容 ui->DataSend->setText(EditText); //將文本內(nèi)容放在發(fā)送欄中 } void MainWindow::on_SendEditBtn2_clicked() { on_ClearButton_clicked(); QString EditText = ui->Edit2->text(); //獲取發(fā)送框內(nèi)容 // qDebug() << "Edit1 text: " << EditText; ui->DataSend->append(EditText); //將文本內(nèi)容放在發(fā)送欄中 } void MainWindow::on_SendEditBtn3_clicked() { on_ClearButton_clicked(); QString EditText = ui->Edit3->text(); //獲取發(fā)送框內(nèi)容 // qDebug() << "Edit1 text: " << EditText; ui->DataSend->append(EditText); //將文本內(nèi)容放在發(fā)送欄中 } void MainWindow::on_SendWordOrder_clicked() { on_SendButton_clicked(); }
源碼:
工程文件.pro文件源碼:
QT += core gui # 引入串口工程類型(第二步) QT += serialport greaterThan(QT_MAJOR_VERSION, 4): QT += widgets CONFIG += c++11 # The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ main.cpp \ mainwindow.cpp HEADERS += \ mainwindow.h FORMS += \ mainwindow.ui # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target
頭文件源碼:
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> // 引入串口通信的兩個頭文件(第一步) #include <QtSerialPort/QSerialPort> // 提供訪問串口的功能 #include <QtSerialPort/QSerialPortInfo> // 提供系統(tǒng)中存在的串口信息 QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); // 串口功能 void SerialPortInit(); // 串口初始化(參數(shù)配置) void RefreshSerialPort(int index); // 刷新串口 public slots: // 串口槽函數(shù) void DataReceived(); // 接收數(shù)據(jù) private slots: // 串口槽函數(shù) void DataSend(); // 發(fā)送數(shù)據(jù) void on_OpenSerialButton_clicked(); // 串口開關(guān) void on_SendButton_clicked(); // 控件中添加 # void on_ClearButton_clicked(); // 清空控件中的所有 # void on_ClearShowButton_clicked(); // 清空接收到的數(shù)據(jù) void LED(bool changeColor); // 開關(guān)顯示燈 // 點(diǎn)擊發(fā)送,接收數(shù)據(jù) void on_SendEditBtn1_clicked(); void on_SendEditBtn2_clicked(); void on_SendEditBtn3_clicked(); void on_SendWordOrder_clicked(); private: Ui::MainWindow *ui; // 串口變量 QSerialPort *serial; // 定義全局的串口對象(第三步) // 參數(shù)配置 QStringList baudList; //波特率 QStringList parityList; //校驗(yàn)位 QStringList dataBitsList; //數(shù)據(jù)位 QStringList stopBitsList; //停止位 QStringList flowControlList; //控制流 }; #endif // MAINWINDOW_H
.cpp文件源碼:
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> #include <QMessageBox> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); SerialPortInit(); } // 串口初始化(參數(shù)配置) void MainWindow::SerialPortInit() { serial = new QSerialPort; //申請內(nèi)存,并設(shè)置父對象 // 獲取計(jì)算機(jī)中有效的端口號,然后將端口號的名稱給端口選擇控件 foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts()) { serial->setPort(info); // 在對象中設(shè)置串口 if(serial->open(QIODevice::ReadWrite)) // 以讀寫方式打開串口 { ui->PortBox->addItem(info.portName()); // 添加計(jì)算機(jī)中的端口 serial->close(); // 關(guān)閉 } else { qDebug() << "串口打開失敗,請重試"; } } // 參數(shù)配置 // 波特率,波特率默認(rèn)選擇57600 ,禁止用戶點(diǎn)擊 ui->BaudBox->addItem("57600"); serial->setBaudRate(QSerialPort::Baud57600); ui->BaudBox->setDisabled(true); // 校驗(yàn),校驗(yàn)?zāi)J(rèn)選擇無 ui->ParityBox->addItem("無"); serial->setParity(QSerialPort::NoParity); // 數(shù)據(jù)位,數(shù)據(jù)位默認(rèn)選擇8位 ui->BitBox->addItem("8"); serial->setDataBits(QSerialPort::Data8); // 停止位,停止位默認(rèn)選擇1位 ui->StopBox->addItem("1"); serial->setStopBits(QSerialPort::OneStop); // 控制流,默認(rèn)選擇無 ui->ControlBox->addItem("無"); serial->setFlowControl(QSerialPort::NoFlowControl); // 刷新串口 RefreshSerialPort(0); // 信號 connect(serial,&QSerialPort::readyRead,this,&MainWindow::DataReceived); // 接收數(shù)據(jù) connect(ui->SendWordOrder,&QPushButton::clicked,this,&MainWindow::DataSend); // 發(fā)送數(shù)據(jù) connect(ui->SendButton,&QPushButton::clicked,this,&MainWindow::DataSend); // 發(fā)送數(shù)據(jù) connect(ui->SendEditBtn1,&QPushButton::clicked,this,&MainWindow::DataSend); // 發(fā)送數(shù)據(jù) connect(ui->SendEditBtn2,&QPushButton::clicked,this,&MainWindow::DataSend); // 發(fā)送數(shù)據(jù) connect(ui->SendEditBtn3,&QPushButton::clicked,this,&MainWindow::DataSend); // 發(fā)送數(shù)據(jù) } // 刷新串口 void MainWindow::RefreshSerialPort(int index) { QStringList portNameList; // 存儲所有串口名 if(index != 0) { serial->setPortName(ui->PortBox->currentText()); //設(shè)置串口號 } else { ui->PortBox->clear(); //關(guān)閉串口號 ui->PortBox->addItem("刷新"); //添加刷新 foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts()) //添加新串口 { portNameList.append(info.portName()); } ui->PortBox->addItems(portNameList); ui->PortBox->setCurrentIndex(1); // 當(dāng)前串口號為COM1 serial->setPortName(ui->PortBox->currentText()); //設(shè)置串口號 } } // 接收數(shù)據(jù),使用read () / readLine () / readAll () void MainWindow::DataReceived() { char BUF[512] = {0}; // 存儲轉(zhuǎn)換類型后的數(shù)據(jù) QByteArray data = serial->readAll(); // 讀取數(shù)據(jù) if(!data.isEmpty()) // 接收到數(shù)據(jù) { QString str = ui->DataReceived->toPlainText(); // 返回純文本 str += tr(data); // 數(shù)據(jù)是一行一行傳送的,要保存所有數(shù)據(jù) ui->DataReceived->clear(); // 清空之前的數(shù)據(jù) ui->DataReceived->append(str); // 將數(shù)據(jù)放入控件中 qDebug() << "str info: " << ui->DataReceived->toPlainText(); // 清除之前的數(shù)據(jù),防止追加,因?yàn)槊看潍@取的數(shù)據(jù)不一樣 int index = str.indexOf("\r\n"); // 找到,返回索引值,找不到,返回-1 if(index != -1) { snprintf(BUF,500,"%s", str.left(index + 2).toUtf8().data()); // QString轉(zhuǎn)為char * 類型 qDebug() << "BUF info: " << BUF; str.remove(0,index + 2); // 處理獲取到的數(shù)據(jù),將其放入對應(yīng)的控件中 // .... } } } // 發(fā)送數(shù)據(jù),write () void MainWindow::DataSend() { serial->write(ui->DataSend->toPlainText().toLatin1()); // 串口發(fā)送數(shù)據(jù) } // 開關(guān)顯示燈 void MainWindow::LED(bool changeColor) { if(changeColor == false) { // 顯示綠色 ui->LED->setStyleSheet("background-color: qradialgradient(spread:pad, cx:0.5, cy:0.5, radius:0.5, fx:0.5, fy:0.5, stop:0 rgba(0, 229, 0, 255), stop:1 rgba(255, 255, 255, 255));border-radius:12px;"); } else { // 顯示紅色 ui->LED->setStyleSheet("background-color: qradialgradient(spread:pad, cx:0.5, cy:0.5, radius:0.5, fx:0.5, fy:0.5, stop:0 rgba(255, 0, 0, 255), stop:1 rgba(255, 255, 255, 255));border-radius:12px;"); } } MainWindow::~MainWindow() { delete ui; } // 串口開關(guān) void MainWindow::on_OpenSerialButton_clicked() { if(serial->isOpen()) // 如果串口打開了,先給他關(guān)閉 { serial->clear(); serial->close(); // 關(guān)閉狀態(tài),按鈕顯示“打開串口” ui->OpenSerialButton->setText("打開串口"); // 關(guān)閉狀態(tài),允許用戶操作 ui->BaudBox->setDisabled(false); ui->ParityBox->setDisabled(false); ui->BitBox->setDisabled(false); ui->StopBox->setDisabled(false); ui->ControlBox->setDisabled(false); // 禁止操作“發(fā)送字符操作” ui->SendWordOrder->setDisabled(true); ui->SendButton->setDisabled(true); // 關(guān)閉狀態(tài),顏色為綠色 ui->OpenSerialButton->setStyleSheet("color: green;"); // 關(guān)閉,顯示燈為紅色 LED(true); // 清空數(shù)據(jù) ui->DataReceived->clear(); ui->DataSend->clear(); } else // 如果串口關(guān)閉了,先給他打開 { //當(dāng)前選擇的串口名字 serial->setPortName(ui->PortBox->currentText()); //用ReadWrite 的模式嘗試打開串口,無法收發(fā)數(shù)據(jù)時,發(fā)出警告 if(!serial->open(QIODevice::ReadWrite)) { QMessageBox::warning(this,tr("提示"),tr("串口打開失敗!"),QMessageBox::Ok); return; } // 打開狀態(tài),按鈕顯示“關(guān)閉串口” ui->OpenSerialButton->setText("關(guān)閉串口"); // 打開狀態(tài),禁止用戶操作 ui->BaudBox->setDisabled(true); ui->ParityBox->setDisabled(true); ui->BitBox->setDisabled(true); ui->StopBox->setDisabled(true); ui->ControlBox->setDisabled(true); // 允許操作“發(fā)送字符操作” ui->SendWordOrder->setDisabled(false); ui->SendButton->setDisabled(false); // 打開狀態(tài),顏色為紅色 ui->OpenSerialButton->setStyleSheet("color: red;"); // 打開,顯示燈為綠色 LED(false); } } // 控件中添加 # void MainWindow::on_SendButton_clicked() { on_ClearButton_clicked(); ui->DataSend->append("###"); } // 清空控件 void MainWindow::on_ClearButton_clicked() { ui->DataSend->setText(""); } // 清空接收到的數(shù)據(jù) void MainWindow::on_ClearShowButton_clicked() { ui->DataReceived->setText(""); } // 點(diǎn)擊發(fā)送后,獲取串口信息并展示在接受控件中 void MainWindow::on_SendEditBtn1_clicked() { on_ClearButton_clicked(); QString EditText = ui->Edit1->text(); //獲取發(fā)送框內(nèi)容 ui->DataSend->setText(EditText); //將文本內(nèi)容放在發(fā)送欄中 } void MainWindow::on_SendEditBtn2_clicked() { on_ClearButton_clicked(); QString EditText = ui->Edit2->text(); //獲取發(fā)送框內(nèi)容 // qDebug() << "Edit1 text: " << EditText; ui->DataSend->append(EditText); //將文本內(nèi)容放在發(fā)送欄中 } void MainWindow::on_SendEditBtn3_clicked() { on_ClearButton_clicked(); QString EditText = ui->Edit3->text(); //獲取發(fā)送框內(nèi)容 // qDebug() << "Edit1 text: " << EditText; ui->DataSend->append(EditText); //將文本內(nèi)容放在發(fā)送欄中 } void MainWindow::on_SendWordOrder_clicked() { on_SendButton_clicked(); }
運(yùn)行后效果:
總結(jié)
到此這篇關(guān)于QT實(shí)現(xiàn)串口通信的文章就介紹到這了,更多相關(guān)QT實(shí)現(xiàn)串口通信內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解C++ 多態(tài)的實(shí)現(xiàn)及原理
這篇文章主要介紹了C++ 多態(tài)的實(shí)現(xiàn)及原理,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-05-05C語言判斷數(shù)是否為素?cái)?shù)與素?cái)?shù)輸出
大家好,本篇文章主要講的是C語言判斷數(shù)是否為素?cái)?shù)與素?cái)?shù)輸出,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12C語言中結(jié)構(gòu)體與內(nèi)存對齊實(shí)例解析
C語言結(jié)構(gòu)體對齊也是老生常談的話題了,基本上是面試題的必考題,這篇文章主要給大家介紹了關(guān)于C語言中結(jié)構(gòu)體與內(nèi)存對齊的相關(guān)資料,需要的朋友可以參考下2021-07-07Cocos2d-x UI開發(fā)之菜單類使用實(shí)例
這篇文章主要介紹了Cocos2d-x UI開發(fā)之菜單類使用實(shí)例,本文的代碼中含有詳細(xì)注釋,需要的朋友可以參考下2014-09-09二維指針動態(tài)分配內(nèi)存連續(xù)問題深入分析
當(dāng)我們定義一個二維指針時,如果需要存儲相應(yīng)的數(shù)據(jù),就需要我們動態(tài)的分配內(nèi)存,這時,有一點(diǎn)是需要注意的,分配內(nèi)存的方法不同,內(nèi)存的連續(xù)性也是不相同的2013-07-07C++利用鏈表實(shí)現(xiàn)圖書信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++利用鏈表實(shí)現(xiàn)圖書信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11一文帶你了解C語言中的動態(tài)內(nèi)存管理函數(shù)
C語言中內(nèi)存管理相關(guān)的函數(shù)主要有realloc、calloc、malloc、free等,這篇文章主要為大家講解一下這四個函數(shù)的具體用法,需要的可以參考一下2023-03-03