菜鸟学习-C语言函数参数传递详解-结构体与数组
2015-07-14 10:24
405 查看
C语言中结构体作为函数参数,有两种方式:传值和传址。
1.传值时结构体参数会被拷贝一份,在函数体内修改结构体参数成员的值实际上是修改调用参数的一个临时拷贝的成员的值,这不会影响到调用参数。在这种情况下,涉及到结构体参数的拷贝,程序空间及时间效率都会受到影响。
例子:
2.传指针时直接将结构体的首地址传递给函数体,在函数体中通过指针引用结构体成员,可以对结构体参数成员的值造成实际影响。效率高,常在大型项目中用到,如著名的开源构架Nginx中对于结构体的使用就是一个很好的例子。例子该会在最后给出。
C语言中数组作为函数参数,一般传递的是数组的首地址。因此在数组名作函数参数时所进行的传送只是地址的传送, 也就是说把实参数组的首地址赋予形参数组名。形参数组名取得该首地址之后,也就等于有了实在的数组。实际上是形参数组和实参数组为同一数组,共同拥有一段内存空间。例子同样见下面Nginx的使用。
最后便于理解,给出ngx_module_t的定义
1.传值时结构体参数会被拷贝一份,在函数体内修改结构体参数成员的值实际上是修改调用参数的一个临时拷贝的成员的值,这不会影响到调用参数。在这种情况下,涉及到结构体参数的拷贝,程序空间及时间效率都会受到影响。
例子:
typedef struct tagSTUDENT{ char name[20]; int age; }STUDENT; void fun(STUDENT stu) { printf(“stu.name=%s,stu.age=%d/n”,stu.name,stu.age); }
2.传指针时直接将结构体的首地址传递给函数体,在函数体中通过指针引用结构体成员,可以对结构体参数成员的值造成实际影响。效率高,常在大型项目中用到,如著名的开源构架Nginx中对于结构体的使用就是一个很好的例子。例子该会在最后给出。
C语言中数组作为函数参数,一般传递的是数组的首地址。因此在数组名作函数参数时所进行的传送只是地址的传送, 也就是说把实参数组的首地址赋予形参数组名。形参数组名取得该首地址之后,也就等于有了实在的数组。实际上是形参数组和实参数组为同一数组,共同拥有一段内存空间。例子同样见下面Nginx的使用。
static ngx_command_t ngx_http_mytest_commands[] = { { ngx_string("mytest"), NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF|NGX_CONF_NOARGS, ngx_http_mytest, NGX_HTTP_LOC_CONF_OFFSET, 0, NULL }, ngx_null_command }; static ngx_http_module_t ngx_http_mytest_module_ctx = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; ngx_module_t ngx_http_mytest_module = { NGX_MODULE_V1, &ngx_http_mytest_module_ctx,//结构体指针传递 ngx_http_mytest_commands,//数组默认地址传递 NGX_HTTP_MODULE, NULL, NULL, NULL, NULL, NULL, NULL, NGX_MODULE_V1_PADDING };
最后便于理解,给出ngx_module_t的定义
typedef struct ngx_module_s ngx_module_t; struct ngx_module_s { ngx_uint_t ctx_index; ngx_uint_t index; ngx_uint_t spare0; ngx_uint_t spare1; ngx_uint_t spare2; ngx_uint_t spare3; ngx_uint_t version; void *ctx; ngx_command_t *commands; ngx_uint_t type; ngx_int_t (*init_master)(ngx_log_t *log); ngx_int_t (*init_module)(ngx_cycle_t *cycle); ngx_int_t (*init_process)(ngx_cycle_t *cycle); ngx_int_t (*init_thread)(ngx_cycle_t *cycle); void (*exit_thread)(ngx_cycle_t *cycle); void (*exit_process)(ngx_cycle_t *cycle); void (*exit_master)(ngx_cycle_t *cycle); uintptr_t spare_hook0; uintptr_t spare_hook1; uintptr_t spare_hook2; uintptr_t spare_hook3; uintptr_t spare_hook4; uintptr_t spare_hook5; uintptr_t spare_hook6; uintptr_t spare_hook7; };
相关文章推荐
- C语言中Static和Const关键字的的作用 -- 转
- GCC+宏及C++
- 1.将一个有序数组反转
- C++ 整型提升的规则
- C++判断矩形相交的方法
- MFC技术内幕系列之(五)---MFC文档序列化内幕
- MFC技术内幕系列之(四)---MFC消息映射与消息传递内幕
- MFC技术内幕系列之(三)----MFC执行期类型识别与动态创建技术内幕
- C++下用什么矩阵运算库比较好
- C++的global data的位置 及PE 文件中的section的内容
- MFC技术内幕系列之(一)---MFC应用程序“生死因果”内幕
- MFC的工具条和状态栏
- Jni 简单实战 获取c++返回值
- C++ 使用delete删除指针(1
- C++引用参数和引用返回值
- C++ 使用delete删除指针(2
- MFC的对话框类CDialog
- C++学习笔记 模板 包含编译模式 分别编译模式
- C++ - 将模板的声明和定义放置在同一个头文件里
- 【零基础学习iOS开发】【02-C语言】08-基本运算