Tag: 参数传递

c函数参数评估顺序

我理解不能保证函数的参数将被调用的顺序,但是,如果有一个函数调用作为参数,是不是保证会首先调用该函数? 我帮助学生在实验室进行编程的入门课程,他们应该创建一个递归因子函数,它接收n(对于n!)和一个指向整数的指针,该整数将用于计算函数调用,然后它们是应该打印结果(n,n!和count)。 许多人抱怨他们使用指针是错误的,所以我查看了代码,他们都是这样的: int fat(int n,int *count) { (*count)++; if(n>1) { return n * fat(n-1,count); } return 1; } int main() { int n, count=0; do { printf(“Write n for fat (n >= 0): “); scanf(“%d”, &n); }while(n<0); printf("Input: %d. Output: %d.\nFunction called %d times.\n\n", n, fat(n, &count), count); printf("%d times\n",count); return 0; } 用gcc编译(Debian […]

C中的int foo(int argc,…)vs int foo()vs int foo(void)

所以今天我认为(第一次不可否认) int foo()实际上与int foo(void)不同,因为第一个允许任意数量的输入而第二个允许零 。 int foo()是否只是忽略任何给定的输入? 如果是这样,那么允许这种forms的function有什么意义呢? 如果没有,你怎么能访问它们,这与变量参数列表有什么不同(例如int foo (int argc, …) )?

在C中传递多维数组

我目前正在努力学习C,我遇到了一个我无法解决的问题。 考虑: #include #include #include #define ELEMENTS 5 void make(char **array, int *array_size) { int i; char *t = “Hello, World!”; array = malloc(ELEMENTS * sizeof(char *)); for (i = 0; i < ELEMENTS; ++i) { array[i] = malloc(strlen(t) + 1 * sizeof(char)); array[i] = strdup(t); } } int main(int argc, char **argv) { char […]

函数参数中的静态关键字

我刚刚在一些嵌入式代码中找到了这个函数定义: float round_float_to_4(static float inputval); 我熟悉静态 (全局变量,函数和局部变量)的其他用法,但这是我第一次将其视为函数参数的说明符。 我假设这迫使编译器使用固定内存位置的inputval而不是堆栈?

C:将可变数量的参数从一个函数传递到另一个函数

所以,这是我现在面临的一个小问题 – >我正在尝试编写一个接受char *消息和可变数量参数的函数。 我的函数会稍微修改一下消息,然后它会用消息和给定的参数调用printf。 实际上,我正在尝试写这样的东西: void modifyAndPrintMessage(char* message,…){ char* newMessage; //copy message. //Here I’m modifying the newMessage to be printed,and then I’d like to print it. //passed args won’t be changed in any way. printf(newMessage,…); //Of course, this won’t work. Any ideas? fflush(stdout); } 所以,任何人都知道我该怎么做才能实现它? 我会非常感谢任何帮助:)

“array”和“&array ”完全可以互换吗?

是的,以前曾经多次询问过,但我想知道哪一个更合适? typedef struct { int a; int addr[8]; } usr_command; usr_command* p_usr_command; int foo(int* parameter) {} 那么哪一个不太容易出问题? foo(p_usr_command->addr); 要么 foo(&p_usr_command->addr[0]); ?

如何修改通过值传递的原始变量的内容?

有一个现有的API函数,只允许插件(DLL)接收三个参数并执行一些操作: int ProcessMe(int nCommand, unsigned int wParam, long lParam); 现在,从主程序(exe),想将两个变量传递给插件,并要求插件修改其内容,主程序将再次读取它们,执行一些任务。 我的问题是,从上面的函数,我可以执行此操作,而无需更改函数参数吗? 例: int ProcessMe(int nCommand, unsigned int wParam, long lParam) { // modify the parameters// return 0; } int main() { BOOL bSave = TRUE; int nOption = 0; ProcessMe(0, (unsigned int)(&bSave), (long)(&nOption)); if(FALSE==bSave) printf(“bSave is modified!”); return 1; }

参数转换:(正常)指向void指针的指针,需要强制转换吗?

当分配到void -pointer或从void -pointer分配时,不需要强制转换(C99§6.3.2.2sub 1/§6.5.16.1sub 1)。 将(例如int – )指针传递给需要void -pointer的函数时,这也是正确的吗? 例如: void foo(void * p){ // Do something } int main(){ int i = 12; foo(&i); // int * to void *: no cast needed? } 当我使用GCC(4.8.1,MinGW-32)编译它时,我既没有错误也没有警告(使用-Wall & -pedantic )。 与此答案相反,建议此调用需要-Wformat (消除-Wformat警告): int main(){ int i = 12; printf(“%p\n”, &i); } 但就我而言,海湾合作委员会并没有抱怨。 那么:将非void -pointer传递给需要void -pointer的函数时需要进行强制转换?

传递函数指针

关于如何将指针传递给指针函数,我有点困惑。 我有一个函数,它指向一个我理解没有问题的函数(ExecBlock)。 但是我给了另一个函数原型(ExecBlock2),它接受了解引用指针(我不确定它到底是什么),如果传递函数有任何参数,也会接受参数。 如果有人可以解释优先级以及解释指针函数究竟会做什么。 这不仅仅是传递函数本身吗? 在这种情况下(void *)做什么? int ExecBlock (void (*f) (void), int isSet) { return ExecBlock2( HOW TO PASS HERE? , NULL, isSet); } int ExecBlock2(void *(*f)(void *), void *arg, int isSet) { … more code } 谢谢!

void指针作为参数

以下C片段: […] void f1(void* a){ printf(“f(a) address = %p \n”,a); a = (void*)(int*)malloc(sizeof(int)); printf(“a address = %p \n”,a); *(int*)a = 3; printf(“data = %d\n”,*(int*)a); } void f(void){ void* a1=NULL; printf(“a1 address = %p \n”,a1); f1(a1); printf(“a1 address = %p \n”,a1); printf(“Data.a1 = %d\n”,*(int*)a1); } […] 结果是 a1 address = (nil) f(a) address = (nil) a […]