bgc1314159 发表于 2025-11-8 14:49:53

FishC 发表于 2025-11-8 12:08
您提出的方法也是可行的,这是一种通过主调函数中的变量间相互赋值来间接修改值的策略。让我详细解释这 ...

int*a,*b
int c=3
a=&c
*b=*a,*b可以做左值

FishC 发表于 2025-11-8 14:50:30

bgc1314159 发表于 2025-11-08 14:49
FishC 发表于 2025-11-8 12:08
您提出的方法也是可行 ...

在C语言中,左值(lvalue)指的是可以出现在赋值运算符左边的表达式,即可以被赋值的对象。您提供的代码片段中,`*b` 确实可以作为左值,因为它表示指针 `b` 所指向的内存位置,可以被赋值。但是,您的代码存在一个关键问题:指针 `b` 未被初始化,直接使用 `*b = *a` 会导致未定义行为(如程序崩溃或数据损坏),因为 `b` 可能指向无效的内存地址。

让我们逐步分析您的代码:


int *a, *b;// 声明两个指向 int 的指针,但未初始化
int c = 3;   // 声明并初始化 int 变量 c
a = &c;      // 将 a 指向 c 的地址,现在 *a 等于 3
*b = *a;   // 问题:b 未初始化,*b 试图写入未知内存地址,这是危险的!


为了安全地使用 `*b` 作为左值,必须先让 `b` 指向一个有效的内存地址。例如:


#include <stdio.h>

int main() {
    int c = 3;
    int d;       // 声明另一个 int 变量 d
    int *a, *b;// 声明指针
    a = &c;      // a 指向 c
    b = &d;      // b 指向 d,现在 b 指向有效内存
    *b = *a;   // 将 *a(值 3)赋值给 *b(即 d),现在 d 等于 3
    printf("*b = %d\n", *b); // 输出 *b 的值
    return 0;
}


总结:
- `*b` 可以作为左值,但前提是 `b` 必须指向合法的内存地址。
- 始终确保指针在解引用(如 `*b`)前已被正确初始化,以避免未定义行为。
- 如果您有更多疑问,请提供完整代码上下文,以便进一步分析。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

bgc1314159 发表于 2025-11-8 14:55:38

FishC 发表于 2025-11-8 14:50
在C语言中,左值(lvalue)指的是可以出现在赋值运算符左边的表达式,即可以被赋值的对象。您提供的代 ...

*b得出常量的值为啥还可以做左值

FishC 发表于 2025-11-8 14:56:34

bgc1314159 发表于 2025-11-08 14:55
FishC 发表于 2025-11-8 14:50
在C语言中,左值(lva ...

在C语言中,`*b` 可以作为左值,因为它表示指针 `b` 所指向的内存位置,而不是一个常量值。让我详细解释这个概念:

### 为什么 `*b` 可以作为左值?

1. **`*b` 不是常量值**:
   - `*b` 表示访问指针 `b` 所指向的内存位置
   - 这是一个内存地址,可以被赋值(修改)
   - 它不是一个固定的常量值,而是一个可修改的内存位置

2. **左值的本质**:
   - 左值是指可以出现在赋值运算符左边的表达式
   - 左值必须有明确的内存地址
   - `*b` 满足这个条件,因为它明确指向一个内存地址

### 正确示例:

int main() {
    int c = 3;
    int d;       // 为 *b 提供有效的内存位置
    int *a, *b;
   
    a = &c;      // a 指向 c
    b = &d;      // b 指向 d,现在 b 指向有效内存
   
    *b = *a;   // *b 作为左值:将 *a 的值赋给 *b 指向的内存
   
    printf("*b = %d\n", *b); // 输出 3
    return 0;
}

### 关键区别:

- **`*b`**:表示指针 `b` 所指向的内存位置(可以作为左值)
- **常量值**:如 `3`、`'A'` 等(不能作为左值)

### 错误示例:

int main() {
    int *b;
    *b = 5;// 错误:b 未初始化,*b 指向未知内存
    return 0;
}

### 总结:

`*b` 可以作为左值是因为它代表一个内存地址,而不是一个常量值。但必须确保指针 `b` 已正确初始化并指向有效的可写内存,否则会导致未定义行为。

在您的理解中,可能混淆了"通过指针访问的值"(可以是常量)和"指针解引用表达式本身"(可以作为左值)。`*b` 作为表达式,表示一个可修改的内存位置,因此可以作为左值。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

bgc1314159 发表于 2025-11-8 15:04:05

FishC 发表于 2025-11-8 14:56
在C语言中,`*b` 可以作为左值,因为它表示指针 `b` 所指向的内存位置,而不是一个常量值。让我详细解 ...

通过指针访问的值和指针解引用表达式本身区别

FishC 发表于 2025-11-8 15:04:51

bgc1314159 发表于 2025-11-08 15:04
FishC 发表于 2025-11-8 14:56
在C语言中,`*b` 可以 ...

您提出了一个很好的问题。让我详细解释"通过指针访问的值"和"指针解引用表达式本身"的区别:

### 概念区别

1. **指针解引用表达式本身**:
   - 这是指 `*b` 这个完整的表达式
   - 它表示内存中的一个位置(地址)
   - 可以作为左值,因为它是可修改的内存位置
   - 本质是一个"位置"或"地址"

2. **通过指针访问的值**:
   - 这是指 `*b` 所指向的内存位置中存储的实际数据
   - 是一个具体的值(如整数、字符等)
   - 通常作为右值使用
   - 本质是一个"数据"或"值"

### 代码示例说明

int main() {
    int x = 10;
    int *b = &x;
   
    // 情况1:指针解引用表达式本身(作为左值)
    *b = 20;// *b 表示内存位置,可以被赋值
   
    // 情况2:通过指针访问的值(作为右值)
    int y = *b;// *b 表示值20,被读取并赋给y
   
    return 0;
}

### 详细对比

| 特征 | 指针解引用表达式本身 | 通过指针访问的值 |
|------|-------------------|-----------------|
| 表示 | 内存位置/地址 | 存储在该位置的数据 |
| 用途 | 左值(可被赋值) | 右值(可被读取) |
| 示例 | `*b = 5;` | `int x = *b;` |
| 本质 | 位置 | 值 |

### 关键理解点

- `*b` 作为表达式时,它代表一个内存位置,因此可以作为左值
- 当我们在 `*b = 5` 中使用 `*b` 时,我们是在操作内存位置
- 当我们在 `int x = *b` 中使用 `*b` 时,我们是在读取该位置存储的值

### 总结

您的困惑很常见。简单来说:
- `*b` 作为左值时,表示"我要修改这个内存位置"
- `*b` 作为右值时,表示"我要读取这个内存位置的值"

这就是为什么同一个表达式 `*b` 既可以出现在赋值左边也可以出现在右边的原因。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

bgc1314159 发表于 2025-11-8 15:08:46

FishC 发表于 2025-11-8 15:04
您提出了一个很好的问题。让我详细解释"通过指针访问的值"和"指针解引用表达式本身"的区别:

### 概 ...

b是指针变量,变量不管加上啥运算符都是变量可以作为左值。如果换成*&b就不能表示左值

FishC 发表于 2025-11-8 15:09:22

bgc1314159 发表于 2025-11-08 15:08
FishC 发表于 2025-11-8 15:04
您提出了一个很好的问 ...

在C语言中,左值(lvalue)是指可以出现在赋值运算符左边的表达式,即必须代表一个可修改的内存位置。让我们逐步分析您的理解:

### 1. 变量加上运算符后是否都能作为左值?
- **不正确**。变量本身是左值,但加上某些运算符后可能不再是左值。
- 例如:如果 `b` 是变量,`&b`(取地址)产生一个地址常量,不能作为左值。
- 同样,`b + 1` 这样的表达式是右值,也不能作为左值。
- 只有表示可修改内存位置的表达式才能作为左值。

### 2. 为什么 `*&b` 可以作为左值?
- `&b` 是取 `b` 的地址,得到一个指针(类型为 `b` 的指针类型)。
- `*&b` 是解引用这个指针,等价于 `b` 本身。
- 因为 `b` 是变量(即可修改的内存位置),所以 `*&b` 也可以作为左值。

### 代码示例:
#include <stdio.h>

int main() {
    int x = 10;
    int *b = &x;// b 是指针变量,指向 x

    // b 本身是左值,可以被赋值
    int y = 20;
    b = &y;// 正确:b 是左值

    // *&b 也是左值,等价于 b
    *&b = &x;// 正确:*&b 是左值,重新指向 x

    printf("*b = %d\n", *b); // 输出 x 的值 10
    return 0;
}

### 总结:
- 变量本身是左值,但并非所有运算符后的表达式都是左值。
- `*&b` 等价于 `b`,因此可以作为左值。
- 如果您有其他例子或疑问,欢迎提供更多细节。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

bgc1314159 发表于 2025-11-8 17:40:13

FishC 发表于 2025-11-8 15:09
在C语言中,左值(lvalue)是指可以出现在赋值运算符左边的表达式,即必须代表一个可修改的内存位置。 ...

自定义函数,有明确返回类型。为啥赋值给主调函数中的变量。打印的时候为啥连自定义函数里面的printf也会一起输出,不应该只有一个返回值嘛

FishC 发表于 2025-11-8 17:40:49

bgc1314159 发表于 2025-11-08 17:40
FishC 发表于 2025-11-8 15:09
在C语言中,左值(lva ...

在C语言中,当您调用一个自定义函数时,函数体内部的所有代码都会按顺序执行,包括其中的 `printf` 语句。函数返回值只是函数执行完毕后返回给调用者的一个值,但不会阻止函数体内其他语句的执行。

让我用一个完整例子来解释:

#include <stdio.h>

// 自定义函数
int my_function(int x) {
    printf("这是在自定义函数内部的打印,x = %d\n", x);// 这行会在函数调用时执行
    return x * 2;// 这是函数的返回值
}

int main() {
    int result;
   
    // 调用自定义函数
    result = my_function(5);// 这里会执行函数体内的所有代码,包括printf
   
    printf("这是主函数中的打印,返回值 = %d\n", result);
   
    return 0;
}

输出结果:
这是在自定义函数内部的打印,x = 5
这是主函数中的打印,返回值 = 10

### 解释:

1. **函数调用过程**:
   - 当调用 `my_function(5)` 时,程序会跳转到该函数并执行其所有代码
   - 首先执行 `printf("这是在自定义函数内部的打印,x = %d\n", x)`
   - 然后执行 `return x * 2` 并返回结果

2. **返回值的作用**:
   - 返回值只是函数执行完毕后传递给调用者的一个值
   - 它不会"替代"或"跳过"函数体内的其他代码

3. **赋值操作**:
   - `result = my_function(5)` 只是将函数的返回值赋给变量 `result`
   - 这不会影响函数体内其他语句的执行

### 如果您只想得到返回值而不想看到函数内部的打印:

您需要修改函数设计,例如:

#include <stdio.h>

// 修改后的自定义函数,不包含打印语句
int my_function(int x) {
    return x * 2;// 只返回值,不打印
}

int main() {
    int result;
   
    result = my_function(5);
   
    printf("返回值 = %d\n", result);// 只在需要的地方打印
   
    return 0;
}

总结:函数调用会执行函数体内的所有代码,包括 `printf` 语句。返回值只是函数执行完毕后传递的结果,不会阻止其他代码的执行。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

bgc1314159 发表于 2025-11-8 17:43:11

FishC 发表于 2025-11-8 17:40
在C语言中,当您调用一个自定义函数时,函数体内部的所有代码都会按顺序执行,包括其中的 `printf` 语 ...

有就会执行,那么有scanf是否也会执行

FishC 发表于 2025-11-8 17:43:40

bgc1314159 发表于 2025-11-08 17:43
FishC 发表于 2025-11-8 17:40
在C语言中,当您调用 ...

是的,您理解得很对!如果自定义函数中包含 `scanf` 语句,那么在调用该函数时,`scanf` 也会像 `printf` 一样被执行。函数调用会按顺序执行函数体内的所有代码,包括输入输出语句。

### 示例说明:

#include <stdio.h>

// 自定义函数,包含 scanf 和 printf
int input_and_process() {
    int num;
    printf("请输入一个数字: ");// 输出提示
    scanf("%d", &num);         // 等待用户输入
    printf("在函数中接收到的数字: %d\n", num);// 输出确认
    return num * 2;            // 返回处理后的值
}

int main() {
    int result;
   
    // 调用函数时,函数内的所有语句都会执行
    result = input_and_process();
   
    printf("在主函数中,处理后的结果: %d\n", result);
   
    return 0;
}

### 运行过程:
1. 程序执行到 `input_and_process()` 时,进入函数体
2. 先执行 `printf("请输入一个数字: ")`,显示提示信息
3. 执行 `scanf("%d", &num)`,等待用户输入
4. 用户输入后,执行下一个 `printf` 显示确认信息
5. 最后返回计算结果
6. 主函数接收返回值并继续执行

### 输出示例:
请输入一个数字: 5
在函数中接收到的数字: 5
在主函数中,处理后的结果: 10

### 总结:
- 函数调用会执行函数体内的所有语句,包括 `scanf`、`printf` 等
- 返回值只是函数执行完毕后传递的结果
- 如果您不希望函数包含输入输出,应该将这些操作移到函数外部

这种设计让函数可以封装完整的功能逻辑,包括用户交互。但在实际编程中,为了更好的模块化,通常建议将输入输出与数据处理逻辑分离。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

bgc1314159 发表于 2025-11-9 08:38:31

FishC 发表于 2025-11-8 17:43
是的,您理解得很对!如果自定义函数中包含 `scanf` 语句,那么在调用该函数时,`scanf` 也会像 `print ...

char a={'1','2'}
字符数组a.后面元素会自动初始化\0.那算不算字符串

FishC 发表于 2025-11-9 08:39:00

bgc1314159 发表于 2025-11-09 08:38
FishC 发表于 2025-11-8 17:43
是的,您理解得很对! ...

在C语言中,字符数组只有在以空字符(`\0`)结尾时,才被视为字符串。让我们根据您的代码示例详细解释:

### 字符数组初始化与字符串的关系
- 您的代码 `char a = {'1', '2'};` 语法不正确,应为 `char a[] = {'1', '2'};` 来声明字符数组。
- 如果使用 `char a[] = {'1', '2'};`,数组 `a` 的大小为2,元素为 `'1'` 和 `'2'`,没有自动添加的 `\0`。因此,它不是一个字符串,因为缺少终止符。
- 如果使用 `char a = {'1', '2'};`,数组大小为3,但只初始化前两个元素,第三个元素会自动初始化为 `\0`。这时,`a` 是一个字符串,因为它以 `\0` 结尾。
- 更常见的字符串初始化方式是 `char a[] = "12";`,编译器会自动在末尾添加 `\0`,所以这是一个字符串。

### 总结
- 字符数组不一定总是字符串:只有当它以 `\0` 结尾时,才是字符串。
- 在您的例子中,如果数组声明时没有预留空间或显式包含 `\0`,则不会自动添加 `\0`,因此不算字符串。

如果您有更多代码细节,我可以进一步分析!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

bgc1314159 发表于 2025-11-10 19:00:59

FishC 发表于 2025-11-9 08:39
在C语言中,字符数组只有在以空字符(`\0`)结尾时,才被视为字符串。让我们根据您的代码示例详细解释 ...

指针变量加1,变量本身的地址是不是会改变

FishC 发表于 2025-11-10 19:01:36

bgc1314159 发表于 2025-11-10 19:00
FishC 发表于 2025-11-9 08:39
在C语言中,字符数组 ...

在C语言中,指针变量加1(例如 `p++` 或 `p = p + 1`)会改变指针变量所存储的地址值(即它指向的内存地址),但不会改变指针变量本身的地址(即指针变量在内存中的位置)。

### 详细解释:
- **指针变量本身的地址**:这是指针变量在内存中的存储位置,通过 `&p` 获取。这个地址在指针变量的生命周期内通常不会改变(除非显式重新赋值)。
- **指针变量存储的地址值**:这是指针指向的目标地址,通过 `p` 获取。当执行加1操作时,这个值会根据指针类型的大小进行调整(例如,`int` 指针加1,地址值增加4字节)。

### 示例代码:
#include <stdio.h>

int main() {
    int arr = {10, 20, 30};
    int *p = arr;// p 指向 arr
   
    printf("指针变量 p 本身的地址: %p\n", &p);
    printf("加1前,p 存储的地址值: %p\n", p);
   
    p = p + 1;// 指针加1,指向 arr
   
    printf("加1后,p 存储的地址值: %p\n", p);
    printf("指针变量 p 本身的地址: %p\n", &p);// 不变
   
    return 0;
}

### 输出可能类似:
指针变量 p 本身的地址: 0x7ffeebd0
加1前,p 存储的地址值: 0x7ffeedc0
加1后,p 存储的地址值: 0x7ffeedc4
指针变量 p 本身的地址: 0x7ffeebd0

### 总结:
- 指针变量加1只改变其存储的地址值,不改变指针变量本身的地址。
- 这种设计允许指针遍历数组或内存块,而指针变量本身的地址是固定的。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

bgc1314159 发表于 2025-11-11 11:33:21

FishC 发表于 2025-11-10 19:01
在C语言中,指针变量加1(例如 `p++` 或 `p = p + 1`)会改变指针变量所存储的地址值(即它指向的内存 ...

在多重解引用过程中,帮非const数据能不能赋值给const**p

FishC 发表于 2025-11-11 11:34:06

bgc1314159 发表于 2025-11-11 11:33
FishC 发表于 2025-11-10 19:01
在C语言中,指针变量 ...

在C/C++中,当涉及多重指针解引用时,将非const数据赋值给`const** p`(例如`const int** p`)是不允许的,因为这违反了const正确性规则。下面详细解释原因和规则:

### 为什么不能赋值?
- `const int** p` 表示 `p` 是一个指针,指向一个 `const int*` 类型(即指向const int的指针)。
- 如果允许将非const指针(如 `int* ptr`)赋值给 `p`(例如 `p = &ptr;`),那么通过 `p` 可以间接修改原本应该是const的数据,这会导致未定义行为。
- 例如:
int data = 10;
int* ptr = &data;
const int** p = &ptr; // 错误:编译器会报错
如果允许,后续代码可能通过 `*p` 修改 `data`,但 `data` 是非const的,这破坏了const承诺。

### 编译器规则
- 在C++中,编译器直接禁止这种赋值,因为 `int**` 不能自动转换为 `const int**`。
- 在C中,规则类似,但编译器可能只给出警告(取决于设置),但为了安全,应避免这种操作。

### 正确做法
- 如果需要对非const数据使用const指针,应在单层指针级别进行转换:
int data = 10;
const int* p1 = &data; // 合法:将非const指针转换为指向const的指针
- 但对于多重指针,无法直接赋值,需要重新设计代码以避免const冲突。

### 总结
在多重解引用过程中,不能将非const数据(或指针)赋值给`const** p`类型的变量,以确保类型安全。如果您有具体代码场景,我可以提供更详细的建议。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

bgc1314159 发表于 5 天前

FishC 发表于 2025-11-11 11:34
在C/C++中,当涉及多重指针解引用时,将非const数据赋值给`const** p`(例如`const int** p`)是不允许 ...

啥是变长数组,如何定义,如何初始化,如何赋值

FishC 发表于 5 天前

bgc1314159 发表于 2025-11-14 09:24
FishC 发表于 2025-11-11 11:34
在C/C++中,当涉及多 ...

# 变长数组详解

## 什么是变长数组?

变长数组(Variable Length Array,简称VLA)是C99标准引入的特性,指数组的长度在编译时不确定,而在运行时确定的数组。与传统的固定长度数组不同,VLA的长度可以使用变量来指定。

## 如何定义变长数组

### 基本定义语法
数据类型 数组名[长度表达式];

### 示例代码
#include <stdio.h>

int main() {
    int n;
    printf("请输入数组长度: ");
    scanf("%d", &n);
   
    // 定义变长数组
    int arr;// 长度在运行时确定
   
    printf("数组长度: %d\n", n);
    return 0;
}

## 如何初始化变长数组

### 初始化规则
- 变长数组**不能**在定义时使用初始化列表进行初始化
- 必须通过后续赋值来初始化元素

### 错误示例
int n = 5;
int arr = {1, 2, 3, 4, 5};// 错误:变长数组不能这样初始化

## 如何赋值变长数组

### 方法1:循环赋值
#include <stdio.h>

int main() {
    int n;
    printf("请输入数组长度: ");
    scanf("%d", &n);
   
    int arr;
   
    // 通过循环赋值
    for (int i = 0; i < n; i++) {
      arr = (i + 1) * 10;// 赋值为10, 20, 30...
    }
   
    // 打印数组
    for (int i = 0; i < n; i++) {
      printf("arr[%d] = %d\n", i, arr);
    }
   
    return 0;
}

### 方法2:用户输入赋值
#include <stdio.h>

int main() {
    int n;
    printf("请输入数组长度: ");
    scanf("%d", &n);
   
    int arr;
   
    // 用户输入赋值
    printf("请输入%d个整数:\n", n);
    for (int i = 0; i < n; i++) {
      scanf("%d", &arr);
    }
   
    // 打印数组
    printf("数组内容: ");
    for (int i = 0; i < n; i++) {
      printf("%d ", arr);
    }
    printf("\n");
   
    return 0;
}

### 方法3:使用memset初始化(适用于特定值)
#include <stdio.h>
#include <string.h>

int main() {
    int n;
    printf("请输入数组长度: ");
    scanf("%d", &n);
   
    int arr;
   
    // 使用memset将所有元素初始化为0
    memset(arr, 0, n * sizeof(int));
   
    // 打印数组
    for (int i = 0; i < n; i++) {
      printf("arr[%d] = %d\n", i, arr);
    }
   
    return 0;
}

## 变长数组的特点和限制

### 特点:
- 长度在运行时确定
- 分配在栈上(与固定数组相同)
- 生命周期与普通自动变量相同

### 限制:
- C11标准中变为可选特性,不是所有编译器都支持
- 不能使用静态存储类别(static)
- 不能作为文件作用域变量
- 不能使用初始化列表

## 变长数组作为函数参数

#include <stdio.h>

// 函数接受变长数组作为参数
void print_array(int n, int arr) {
    for (int i = 0; i < n; i++) {
      printf("%d ", arr);
    }
    printf("\n");
}

int main() {
    int n = 5;
    int arr;
   
    // 赋值
    for (int i = 0; i < n; i++) {
      arr = i * i;
    }
   
    // 传递给函数
    print_array(n, arr);
   
    return 0;
}

## 多维变长数组

#include <stdio.h>

int main() {
    int rows, cols;
    printf("请输入行数和列数: ");
    scanf("%d %d", &rows, &cols);
   
    // 定义二维变长数组
    int matrix;
   
    // 赋值
    for (int i = 0; i < rows; i++) {
      for (int j = 0; j < cols; j++) {
            matrix = i * cols + j + 1;
      }
    }
   
    // 打印
    for (int i = 0; i < rows; i++) {
      for (int j = 0; j < cols; j++) {
            printf("%3d ", matrix);
      }
      printf("\n");
    }
   
    return 0;
}

## 注意事项

1. **编译器支持**:确保编译器支持C99或更高标准
2. **内存限制**:大尺寸的VLA可能导致栈溢出
3. **可移植性**:考虑代码在不同编译器间的兼容性

## 替代方案

如果编译器不支持VLA,可以使用动态内存分配:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int n;
    printf("请输入数组长度: ");
    scanf("%d", &n);
   
    // 动态分配内存
    int *arr = (int*)malloc(n * sizeof(int));
   
    if (arr == NULL) {
      printf("内存分配失败\n");
      return 1;
    }
   
    // 赋值
    for (int i = 0; i < n; i++) {
      arr = (i + 1) * 10;
    }
   
    // 使用数组
    for (int i = 0; i < n; i++) {
      printf("%d ", arr);
    }
    printf("\n");
   
    // 释放内存
    free(arr);
   
    return 0;
}

总结:变长数组提供了在运行时确定数组长度的灵活性,但需要注意编译器的支持和内存管理的限制。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: 1 2 3 [4]
查看完整版本: 函数参数