Time of Update: 2018-12-04
懂得C語言的人都知道,C語言之所以強大,以及其自由性,絕大部分體現在其靈活的指標運用上。因此,說指標是c語言的靈魂,一點都不為過。所以從我的標題加了個(一)也可以看出指標的重要性,我儘可能的向大家交代清楚我對於指標的理解。所以在講解的過程中我儘可能的用代碼加文字的描述方式,通過代碼的分析來加深我們對於指標的理解,我給出的都是完整的代碼,所以讀者可以在看的過程中直接copy下去即可運行,希望下面的講解能夠對你有所協助。首先讓我們來看看定義一個指標的一般形式為:基底類型
Time of Update: 2018-12-04
在講解堆棧之前,我們先要來說說其實我們常說的堆棧是兩種資料結構。那麼什麼是堆什麼又是棧呢? 棧,是硬體。主要作用表現為一種資料結構,是只能在某一端插入和刪除的特殊線性表。它按照後進先出的原則儲存資料,先進入的資料被壓入棧底,最後的資料在棧頂,需要讀資料的時候從棧頂開始彈出資料(最後一個資料被第一個讀出來)。棧是允許在同一端進行插入和刪除操作的特殊線性表。允許進行插入和刪除操作的一端稱為棧頂(top),另一端為棧底(bottom);棧底固定,而棧頂浮動;棧中元素個數為零時稱為空白棧。插
Time of Update: 2018-12-04
預先處理是C語言的一個重要知識點,它能改善程式設計的環境,有助於編寫易移植、易調試的程式。因此,我們有必要掌握好預先處理命令,在自己編程的時候靈活的使用它,使得編寫的程式結構優良,更加易於調試和閱讀。接下來我儘可能的把預先處理中重要知識點向讀者講解清楚,使讀者能夠在自己以後編程的過程中熟練的使用預先處理命令。C語言的預先處理主要有三個方面:1、檔案的包含2、宏定義3、條件編譯一、檔案包含的形式有下面兩種1、#include "檔案名稱" 2、#include <檔案名稱>
Time of Update: 2018-12-04
1、#error文法格式:#error token-sequence主要作用:在編譯的時候輸出編譯錯誤資訊token-sequence,方便程式員檢查程式中出現的錯誤。實 例:#include "stdio.h"int main(int argc, char* argv[]){#define CONST_NAME1 "CONST_NAME1"printf("%s\n",CONST_NAME1);#undef CONST_NAME1#ifndef CONST_NAME1#error
Time of Update: 2018-12-04
前幾天被問到,在C++裡建立一個空類什麼都成員沒有,它佔多大記憶體?我一下子懵掉了,還真沒想過這個問題。後來查了下資料終於明白了,且聽我慢慢道來。首先我們看一下這個測試程式:#include <iostream>using namespace std; class Test{};main(){Test t;cout<<"size :"<<sizeof(t)<<endl;}輸出結果是:size :
Time of Update: 2018-12-04
在開始寫linux核心雙向迴圈鏈表之前,我一直在想我要不要用長篇大論的文字來描述linux核心雙向迴圈鏈表呢?經過認真的思考之後,我否決了用枯燥的文字向讀者描述linux核心雙向迴圈鏈表的想法,因為對於程式設計語言來說我相信大多數的讀者都應該不喜歡面對枯燥的文字,更喜歡看到代碼,同時那也是讀者閱讀文字後想要實現的東西,所以我決定在這裡採用代碼加上適當的文字描述的方法來進行講解,這就使得我不可能用一篇的篇幅來講解完,所以會寫兩篇文章來講解這個知識點。希望讀者能夠堅持看完,學會以後在應用程式中寫雙向
Time of Update: 2018-12-04
複製建構函式:只有單個形參,而且形參是對本類類型對象的引用(常用const修飾),這樣的建構函式稱為複製建構函式。與預設建構函式一樣,複製建構函式可由編譯器隱式調用。複製建構函式可以用於:根據另一個同類型的對象顯式或隱式初始化一個對象複製一個對象,將它作為實參傳給一個函數從函數返回時複製一個對象初始化順序容器中的元素根據元素初始化列表初始化數組元素賦值操作符:與複製建構函式一樣,如果沒有定義自己的賦值操作符,則編譯器會合成一個。下面我寫了一個程式對以上描述做出解釋。#include<ios
Time of Update: 2018-12-04
C++記憶體配置由五個部分組成:棧、堆、全域代碼區、常量區、程式碼區。如所示:1、棧區:函數中定義的局部變數放在棧中,函數執行結束時儲存單元自動釋放。棧記憶體配置一般採用寄存器來存取,存取效率高但是記憶體容量有限。2、堆區:通常在堆中進行動態分配。程式啟動並執行時候用new或malloc申請一定大小的記憶體,用delete或free釋放之前申請的記憶體。不管記憶體空間在何時申請,只要沒有用delete或free釋放該記憶體空間就一直被佔用著。也就是說,動態記憶體分配的變數的生存周期由程式員自己決
Time of Update: 2018-12-04
一、rand() 函數名: rand 功 能: 隨機數發生器 用 法: int rand(void); 所在標頭檔: stdlib.h 函數說明 : rand()的內部實現是用線性同餘法做的,它不是真的隨機數,因其周期特別長,故在一定 的範圍裡可看成是隨機的。 rand()返回一隨機數值的範圍在0至RAND_MAX 間。RAND_MAX的範圍最少是在32767之間(
Time of Update: 2018-12-04
C++中允許一種特殊的聲明比變數的方式。在這種情況下,可以將一個對應於建構函式參數類型的資料直接賦值給類變數。編譯器在編譯時間會自動進行類轉換,將對應於建構函式參數類型的資料轉換為類的對象。但是這種寬鬆的規則會破壞代碼的可讀性,並導致難以發現的錯誤。其實只要在建構函式前加上explicit則會禁止這種自動轉換。要注意的是explicit只對建構函式起作用。 下面來舉例說明。#include<iostream>using namespace std;class Test{
Time of Update: 2018-12-04
需求:一份C++源碼中許多 cout<<....<<endl ,終端總是輸出很多資訊,現在想把這些輸出定位到一個檔案中去,所以希望可以實現cout的重新導向功能。實現: 將標準輸出(cout)重新導向到檔案out.txt中freopen("out.txt","w",stdout);該函數一般用於對標準輸入、標準輸出以及標準出錯流的重新導向,實驗證明對於普通的檔案重新導向本函數也可以完成。首先獲得FILE指標 FILE *lpf = fopen("out.txt","w")
Time of Update: 2018-12-04
C++中的operator主要有兩個作用,一是操作符的重載,一是操作符的轉換。對於操作符的重載,許多人都不陌生,用以下這個小例子溫故一下:class A{ public: A operator +(A& oa){A a;a.num=oa.num+num;return a;} int num;};int main(int argc,char* argv[]){ A a; a.num=1; A b; b.num=2; A c; c=a+b;
Time of Update: 2018-12-04
在C++中,函數可以有預設參數:void Fun( int n = 1){ cout<<n<<"/n";}void main(){ Fun(); Fun(20);} output:120但是在C# 中,你卻不能定義一個類似:void Fun( int n = 1)的函數,原因就是C# 中取消了函數的預設參數功能。C# 比 C++
Time of Update: 2018-12-04
顯式類型轉換也叫做強制類型轉換,強制轉換的操作符包括:static_cast、dynamic_cast、const_cast、reinterpret_cast。(1)static_cast。C++中所有的隱式類型轉換都可以通過此運算子完成,尤其對於會損失精度的大算術類型賦值小算術類型的情況,有了static_cast描述符,編譯器便會認為這是條正常語句,而不會報警示告資訊;另一個典型的應用情境就是對void 類型指標的類型定義。const char
Time of Update: 2018-12-04
sizeof是C語言中判斷資料類型或者運算式長度符;不是一個函數,位元組數的計算在程式編譯時間進行,而不是在程式執行的過程中才計算出來。文章來源:http://blog.sina.com.cn/s/blog_5c717fa001012ml7.htmlsizeof函數功能:計算資料空間的位元組數1.與strlen()比較strlen計算字元數組的字元數,以"\0"為結束判斷,不計算為'\0'的數組元素。sizeof計算資料(包括數組、變數、類型、結構體等)所佔記憶體空間,用位元組數表示(當然用在字
Time of Update: 2018-12-04
原文連結:一個用C/C++分別實現介面與實現相分離的設計原則的例子良好的設計應該只暴露介面給使用者,所有的實現細節對使用者來說應該是隱藏的,也就是說使用者只要給介面傳遞相應的參數就行了,不需要管內部是如何?的,比如我們使用fopen,fseek,CreateWindow等函數會發現很好用,而不需要管fopen,fseek,CreateWindow函數內部代碼是如何?的,資料結構是如何組織的,也就是說絕對不能暴露任何的細節給使用者,包括資料群組織在內。我現在用C和C++舉一個例子,來說說C/C++
Time of Update: 2018-12-04
“有時候,在選擇轉載和原創時,自己迷惑了,多少知識都是別人嚼爛了啊”——————————————————————————————————————前言:雖然可變參數的可以執行很差,受平台影響,cpu arch,大小端,棧增長等,不過有時候不考慮這些時,可以考慮用其完成一些技巧。註:用#pragma print???1. va_argva_arg(args, bool)va_arg(args,
Time of Update: 2018-12-04
使用標準C++的類型轉換符:static_cast、dynamic_cast、reinterpret_cast、和const_cast。3.1 static_cast用法:static_cast < type-id > ( expression ) 該運算子把expression轉換為type-id類型,但沒有運行時類型檢查來保證轉換的安全性。它主要有如下幾種用法:①用於類階層中基類和子類之間指標或引用的轉換。 進行上行轉換(把子類的指標或引用轉換成基類表示)是安全的;
Time of Update: 2018-12-04
只要學了C++的人,肯定知道靜態聯編和動態聯編,如果你不知道,ok那你學習之路還長。簡單的靜態聯編的東西就不說了。先看下面程式。class AA{ public: void result() { std::cout << "Surprise?" << std::endl; }; };int main(){ AA *p = NULL; p->result(); system("Pause");
Time of Update: 2018-12-04
Regex是一種模式比對形式,它通常用在處理的文本程式中。比如我們經常使用的grep工具,還是perl語言都使用了Regex。傳統的C++處理Regex是非常麻煩的,這也成為很多其他語言愛好者的笑柄,現在情況不一樣了,因為有了boost。