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;
}