c/c++基礎

C++ main函數的參數

C++的main函數可以沒有輸入參數,也可以有輸入參數,而且只能有兩個參數,習慣上coding如下:

 int main(int argc, char* argv[]) 或者 int main(int argc, char** argv)

argc :表示傳入main函數的數組元素個數,爲int類型,
argv :表示傳入main函數的指針數組,爲char**類型。

//test project
#include <iostream>

int main(int argc, char** argv) {
    for(int i=0;i<argc;i++)
        std::cout << argv[i] << std::endl;
    return 0;
}

執行:

test eee ffff

輸出:

/Users/moyao/CLionProjects/test/cmake-build-debug/test
eee
ffff

char** 和char *a[]

char  *s ; 
s = "mgchen";   //此處爲什麼可以把一個字符串常量賦值給一個指針呢??
**原因就是,字符串常量在編譯器中是把它看做一個地址。s這個指針也保存字符串的首地址"m",s[1]"g"地址**

char *a[]  表示一個數組,數組中的元素纔是char * (即元素是指向char類型的指針)char **s   爲一個二級指針,s中保存的是一級指針char *的地址。可以這麼來理解char *(*s),我定義一個指針s,但是我指針s保存的不是傳統某個變量的地址,而是保存的是一個char * 指針的地址。(把char理解爲a,char *理解爲b,char**理解爲c。那麼b的值是a的地址,然而c的值又爲b的地址)

C++在指定內存構造對象

class Person {
private:
  int age;
  std::string name;
public:
  // methods
};
 
int main(int argc, char** argv) {
 
  char mem[sizeof(Person)]; // 或者 auto mem = malloc(sizeof(Person));
 
  auto p = new(mem) Person();
 
  assert((void*)p == (void*)mem); // 兩個指針指向同一塊內存
 
  return 0;
}

使用new生成對象實際上執行了三個操作:

  1. 調用operator new分配內存
  2. 調用類的構造函數
  3. 返回指針

其中operator new是可重載的,無論全局還是特定類。其函數原型爲:

void* operator new(size_t sz);

c的函數定義

void * fun( ) ; //聲明一個返回值是任意類型的指針 的函數fun()

void vfun( ) ; //聲明一個沒有返回值 的函數vfun()

函數指針變量

void (*)( ) 這是一種變量類型。

void void vfun() { //聲明一個沒有返回值 
}
//聲明一個函數指針變量pfun
//也可寫成void (*pFunction)(void)
//也可以使用typedef void (*pfun)();
void (*pfun)(); 
pfun = vfun; //該類型函數就是void vfun() 這種類型

//對於一個給定的entry地址
entry = &fun;
//把它轉換成爲函數指針
(void (*) (void))entry;
//調用
((void (*) (void))(entry))();

C++ 創建對象的三種方式

#include <iostream> 
using namespace std; 
class A 
{ 
private: 
    int n; 
public: 
    A(int m):n(m) 
    { } 
    ~A(){} 
}; 
int main() 
{ 
    A a(1);  //棧中分配 
    A b = A(1);  //棧中分配 
    //第一種和第二種沒什麼區別,一個隱式調用,一個顯式調用
    A* c = new A(1);  //堆中分配 
    //棧中內存的分配和釋放是由系統管理,而堆中內存的分配和釋放必須由程序員手動釋放
  delete c; 
    return 0; 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章