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生成對象實際上執行了三個操作:
- 調用operator new分配內存
- 調用類的構造函數
- 返回指針
其中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;
}