1、main函数的参数
extern char **environ; int main(int argc, char **argv) { // 这里忽略对argc值的检查 printf("argv: %p, %s ", argv[0], argv[0]); printf("argv: %p, %s ", argv[1], argv[1]); printf("argv: %p, %s ", argv[2], argv[2]); char *p = environ[0]; char *q = environ[1]; printf("env: %p, %s ", p, p); printf("env: %p, %s ", q, q); return 0; }
编译以上代码,并运行./a.out hello world,得到以下输出:
argv: 0xbfaa438f, ./a.out argv: 0xbfaa4397, hello argv: 0xbfaa439d, world env: 0xbfaa43a3, XDG_VTNR=7 env: 0xbfaa43ae, XDG_SESSION_ID=c2
可知main函数的参数和environ的内存布局如下:
argv之后的部分是环境变量,可参照printenv(打印指定环境变量的值,或所有环境变量的名字和值):
2、函数指针
void func(int i, const char *ch) { cout << i << " " << ch << endl; } // 第三个参数(函数类型)自动转换为函数指针类型 // 等效于void foo(int a, int b, void (* func)(int i, const char *ch)) void foo(int a, int b, void func(int i, const char *ch)) { cout << a << " " << b << endl; func(3, "hello"); } // 等效于void (* bar(int a))(int, const char *) {...} // 返回值可以定义为函数指针类型,但不能为函数类型,如这样是错误的: // typedef void pf(int, const char *); pf bar(int a) {...} typedef void(* func_ptr)(int, const char *); func_ptr bar(int a) { cout << a << endl; return &func; } int main() { foo(1, 2, func); bar(4)(5, "world"); // 在引用函数名但又没有调用该函数时,函数名将被自动解释为函数指针 // 等效于void (* func_ptr)(int, const char *) = &func; void (* func_ptr)(int, const char *) = func; // 函数指针可用于调用它所指向的函数,不需要使用解引用操作符(隐式解引用) // 等效于(*func_ptr)(3, "hello"); (func_ptr)(3, "hello"); // 使用typedef简化函数指针类型的使用 typedef void(* func_ptr)(int, const char *); func_ptr fp = &func; // 类似地,函数也可以使用typedef typedef void func_type(int, const char *); func_type *fp = func; func_type f1; return 0; }
函数指针的应用:如回调函数。
参考资料:
《C++ Primer》
不断学习中。。。