结构体指针传递、函数内值递增及自动编号实现问题
C语言结构体相关问题解答
1. 被调用函数中递增变量的值
要在被调用函数里修改并递增主调函数的变量,必须传递变量的指针。因为C语言是值传递,直接传变量会生成副本,修改副本不会影响原变量。
示例代码:
#include <stdio.h> void increment(int *num) { // 解引用指针,操作原变量内存地址的值 (*num)++; } int main() { int count = 0; increment(&count); // 传递变量的地址 printf("递增后count的值:%d\n", count); // 输出1 return 0; }
核心:用*解引用指针访问原变量,传参时用&取变量地址。
2. 结构体指针传递给函数
先声明结构体类型,定义结构体指针后,将指针(或结构体的地址)传给函数,函数内用->运算符访问结构体成员。
示例代码:
#include <stdio.h> #include <string.h> // 声明customer结构体 typedef struct { char name[50]; int number; } customer; // 接收结构体指针的函数:打印客户信息 void print_customer(customer *pcust) { printf("编号:%d,姓名:%s\n", pcust->number, pcust->name); } int main() { customer cust; customer *pcust = &cust; // 让指针指向结构体变量的地址 // 用指针给成员赋值 strcpy(pcust->name, "Alice"); pcust->number = 1; // 传递结构体指针给函数 print_customer(pcust); // 你提到的pcust->number++直接使用即可,前提是指针已指向有效结构体 pcust->number++; print_customer(pcust); // 此时number为2 return 0; }
核心:结构体指针访问成员用->,普通结构体变量用.;传递指针时要确保其指向已分配内存的结构体(栈变量或堆内存)。
3. 自动分配连续编号并全局可用
用静态全局变量存储当前最大编号,它会保留上次的值,且仅在当前文件可见,不会污染全局命名空间。每次创建新结构体时,递增该变量并赋值给结构体的number字段。
示例代码:
#include <stdio.h> #include <string.h> typedef struct { char name[50]; int number; } customer; // 静态全局变量:记录当前编号,初始为0,仅当前文件可访问 static int current_id = 0; // 输入客户信息并自动分配编号 void input_customer(customer *pcust) { printf("请输入客户姓名:"); scanf("%s", pcust->name); // 自动分配下一个连续编号 current_id++; pcust->number = current_id; } // 打印客户信息 void print_customer(customer *pcust) { printf("%d %s\n", pcust->number, pcust->name); } int main() { customer custs[3]; // 存储3个客户信息 // 输入3个客户 for (int i = 0; i < 3; i++) { input_customer(&custs[i]); } // 打印所有客户 printf("\n客户列表:\n"); for (int i = 0; i < 3; i++) { print_customer(&custs[i]); } return 0; }
运行效果:
请输入客户姓名:customer1 请输入客户姓名:customer2 请输入客户姓名:customer3 客户列表: 1 customer1 2 customer2 3 customer3
核心:静态全局变量current_id在程序运行期间持续保留值,每次调用input_customer自动递增,实现连续编号;若需跨文件访问,可去掉static改为全局变量,或封装获取编号的函数。
内容的提问来源于stack exchange,提问作者gwen
相关产品推荐
相关产品推荐

