C语言教程 第31页 C 传值方式调用函数 C 函数 向函数传递参数的传值调用方法,把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数不会影响实际参数。 默认情况下,C 语言使用传值调用方法来传递参数。一般来说,这意味着函数内的代码不会改变用于调用函数的实际参数。函数 swap() 定义如下: /* 函数定义 */ void swap(int x, int y) { int temp; temp = x; /* 保存 x 的值 */ x = y; /* 把 y 赋值给 x */ y = temp; /* 把 temp 赋值给 y */ return; } 现在,让我们通过传递实际参数来调用函数 swap(): #include <stdio.h> /* 函数声明 */ void swap(int x, int y); int main () { /* 局部变量定义 */ int a = 100; int b = 200; printf("交换前,a 的值: %d\n", a ); printf("交换前,b 的值: %d\n", b ); /* 调用函数来交换值 */ swap(a, b); printf("交换后,a 的值: %d\n", a ); printf("交换后,b 的值: %d\n", b ); return 0; } 当上面的代码被编译和执行时,它会产生下列结果: 交换前,a 的值: 100 交换前,b 的值: 200 交换后,a 的值: 100 交换后,b 的值: 200 上面的实例表明了,虽然在函数内改变了 a 和 b...
2024-04-03
C 嵌套循环 C 循环 C 语言允许在一个循环内使用另一个循环,下面演示几个实例来说明这个概念。 语法 C 语言中 嵌套 for 循环 语句的语法: for ( init; condition; increment ) { for ( init; condition; increment ) { statement(s); } statement(s); } C 语言中 嵌套 while 循环 语句的语法: while(condition) { while(condition) { statement(s); } statement(s); } C 语言中 嵌套 do…while 循环 语句的语法: do { statement(s); do { statement(s); }while( condition ); }while( condition ); 关于嵌套循环有一点值得注意,您可以在任何类型的循环内嵌套其他任何类型的循环。比如,一个 for 循环可以嵌套在一个 while 循环内,反之亦然。 实例 下面的程序使用了一个嵌套的 for 循环来查找 2 到 100 中的质数: #include <stdio.h> int main () { /* 局部变量定义 */ int i, j; for(i=2; i<100; i++) { for(j=2; j <= (i/j); j++) if(!(i%j)) break; // 如果找到,则不是质数 if(j > (i/j)) printf("%d 是质数\n", i); } return 0; } 当上面的代码被编译和执行时,它会产生下列结果: 2 是质数 3 是质数 5 是质数 7 是质数...
2024-04-03
学习C – C函数参数 您可以使用const关键字限定一个函数参数,这表示函数会处理参数作为常量。 通常,将const关键字应用于作为指针的参数。 这里是一个带有const参数的函数的例子: bool hello(const char* pmessage){ ... } 具有可变数量参数的函数 以下代码显示了如何使用可变长度参数声明一个函数原型。 double average(double v1, double v2, ...); 省略号表示一个变量参数数量可以跟随前两个固定参数。 可变长度参数列表必须至少有一个固定参数。 要引用参数,请使用指针。 您需要使用三个函数来处理可变数量的参数。 它们称为va_start(),va_arg()和va_end()。 您必须调用va_start()来初始化变量参数列表指针的值功能。此指针必须声明为类型va_list。 va_start()具有以下形式: void va_start(va_list parg, last_fixed_arg); 此函数接受两个参数:类型为va_list的指针parg,以及为该函数指定的最后一个固定参数的名称。 va_list类型是在stdarg.h中定义的类型。 va_arg()的第一个参数是通过调用va_start()初始化的变量parg。 第二个参数是类型的规范期望找到的参数。 函数va_arg()返回由parg指定的当前参数的值这是存储在值。 它更新指针parg以指向列表中的下一个参数。 va_end()是清理。 它将parg指针重置为NULL。 #include <stdio.h> #include <stdarg.h> //from www. j av a 2 s .c om double average(double v1 , double v2,...); // Function prototype int main(void) { double v1 = 1.5, v2 = 2.5; int num1 = 6, num2 = 5; long num3 = 2L, num4 = 12L; printf("Average = %.2lf\n", average(v1, 3.5, v2, 4.5, 0.0)); printf("Average = %.2lf\n", average(1.0, 2.0, 0.0)); printf("Average = %.2lf\n", average( (double)num2, v2,(double)num1, (double)num4,(double)num3, 0.0)); return 0; } // Function to calculate the average of two or more...
2024-04-03
学习C – C函数 变量作用域和生命周期 这个例子涉及一个循环的嵌套块: 你在循环块中声明和定义count2: count2在每次循环迭代时重新创建,初始值为0。 在每个循环迭代期间,count2被创建,初始化,递增和销毁。 变量count1存在于main()块级别。 它在递增时继续存在。 #include <stdio.h> int main(void) { int count1 = 1; // Declared in outer block do { int count2 = 0; // Declared in inner block ++count2; printf("count1 = %d count2 = %d\n", count1, count2); } while( ++count1 <= 10); // count2 no longer exists printf("count1 = %d\n", count1); return 0; } 上面的代码生成以下结果。 新作用域 以下代码有两个名为count的变量。 在循环块内,局部变量将“隐藏”存在于main()块级别的count版本。 count是指的是在当前块的声明。 在do-while循环中,只能达到局部版本的count。 循环块中的printf()显示局部count值,该值始终为1。 一旦退出循环,外部count变量变为可见,最后一个printf()从循环中显示其最终值。 #include <stdio.h> int main(void) { int count = 0; // Declared in outer block do { int count = 0; // This is another variable called count ++count; // this applies to inner count printf("count = %d\n", count); } while( ++count <= 10); // This works with outer count printf("count =...
2024-04-03
学习C – C算术运算符 C支持四种基本的算术运算,如加法,减法,乘法和除法。 算术语句具有以下形式: variable_name = arithmetic_expression; =运算符右侧的算术表达式使用存储在变量或显式数字中的值进行计算,该值使用算术运算符进行组合,如加法(+),减法( – ),乘法(*),和除法(/)。 total_count = birds + tigers + pigs + others; 下表列出了基本算术运算符。 运算符 操作 + 加法 – 减法 * 乘法 / 除法 % 求余 运算符应用于的值称为操作数。需要两个操作数(如%)的运算符称为二进制运算符。 适用于单个值的运算符称为一元运算符。因此 – 是表达式a-b中的二进制运算符和表达式-data中的一元运算符。 #include <stdio.h> int main(void) { int cakes = 5; int CALORIES = 125; // Calories per cookie int total_eaten = 0; int eaten = 2; cakes = cakes - eaten; total_eaten = total_eaten + eaten; printf("I have eaten %d cakes. There are %d cakes left", eaten, cakes); eaten = 3; // New value for cakes eaten cakes = cakes - eaten; total_eaten = total_eaten + eaten; printf("\nI have eaten %d more. Now there are %d cakes left\n", eaten, cakes); printf("\nTotal energy consumed is...
2024-04-03
了解C – C条件运算符 条件运算符计算为两个表达式之一,具体取决于逻辑表达式是否计算true或false。 因为涉及三个操作数,所以此运算符也称为三元运算符。 使用条件运算符的表达式的一般表示形式如下所示: condition ? expression1 : expression2 运算符如何相对于操作数进行排列。 ?字符遵循逻辑表达式, 条件。 在右边?是两个表示选择的操作数, expression1 和 expression2。 如果condition的计算结果为 true, 则操作产生的值将是 expression1 的值; 如果condition计算为 false, 则为 expression2 的值。 注意 请注意,只有一个,表达式1或表达式2将被计算。 x = y > 7 ? 25 : 50; 如果y大于7,则该结果将x设置为25,否则为50。 这是一个很好的速记方式,产生与此相同的效果: if(y > 7) x = 25; else x = 50; 例如,您可以编写一个表达式,比较两个薪水并获得两个薪水中的较大者,如下所示: your_salary > my_salary ? your_salary : my_salary 例子 下面是您如何处理该操作的方法: #include <stdio.h> int main(void) { const double PRICE = 3.50; // Unit price in dollars const double rate1 = 0.05; // Discount for more than 10 double my_rate = 0.0; int quantity = 0; printf("Enter the number that you want to buy:"); scanf(" %d", &quantity); my_rate = quantity > 10 ? rate1 : 0.6; printf("The price for %d is...
2024-04-03
学习C – C运算符优先级 表显示了C中所有运算符的优先顺序,从顶部到最低的底部。 优先级 操作符 描述 1 () 括号表达式 1 [] 数组下标 1 . 成员选择(对象) 1 -> 成员选择(指针) 1 ++ — 后缀自增 / 后缀自减 2 + – 一元 + 和 – 2 ++ — 前缀自增 / 前缀自减 2 ! ~ 逻辑非 / 按位取反 2 * 取指针指向的值 2 & 取地址运算符 2 sizeof 长度运算符 2 (type) 强制类型转换 3 * / % 乘法 / 除法 / 取余 4 + – 加号 / 减号 5 << >> 位左移 / 位右移 6 < <= 小于 / 小于等于 6 > >= 大于 / 大于等于 7 == != 等于 / 不等于 8 & 按位与 9 ^ 按位异或 10 | 按位或 11 && 逻辑与 12 || 逻辑或 13 ?: 条件运算符 14 = 赋值 14 += −= 相加后赋值...
2024-04-03
学习C – C位运算符 位运算符对整数值的位进行操作。 有六个位运算符,如下表所示。 操作符 描述 & 按位与运算符 | 按位或运算符 ^ 按位异或运算符 ~ 按位取反运算符,也称为1的补码运算符 >> 按位右移运算符 << 按位左移运算符 所有这些仅对整数类型进行操作。 〜运算符是一元运算符 – 它适用于一个操作数 – 其他是二元运算符。 位与 按位与运算符&,以这样的方式组合其操作数的相应位,如果两个位都为1,则结果位为1;否则,结果位为0。 假设你声明以下变量: int x = 13; int y = 6; int z = x & y; // AND corresponding bits of x and y 在第三个语句之后,z将具有值4(二进制100)。 这是因为x和y中的相应位组合如下: x 0 0 0 0 1 1 0 1 y 0 0 0 0 0 1 1 0 x & y 0 0 0 0 0 1 0 0 例子 #include <stdio.h> int main(void) { int x = 13; int y = 6; int z = x & y; // AND corresponding bits of x and y printf("\n original = %X", x); printf("\n original = %X", y); printf("\t...
2024-04-03
学习C – C数组指针 数组和指针 数组是同一类型的值的集合。 指针是可以引用另一个的变量(存储器地址)变量。 你可以使用指针来保存不同的地址变量,只要它们“全部是相同的类型。 没有索引值的数组名称指的是数组中第一个元素的地址。 您可以更改指针中包含的地址,但是你不能改变数组名引用的地址。 下面的代码显示一个数组名称本身指的是一个地址。 #include <stdio.h> int main(void) { char multiple[] = "My string"; char *p = &multiple[0]; printf("The address of the first array element : %p\n", p); p = multiple; printf("The address obtained from the array name: %p\n", multiple); return 0; } 从输出我们知道表达式& multiple [0] 产生与表达式multiple相同的值。 上面的代码生成以下结果。 例2 因为多个计算结果的第一个字节的地址数组和& multiple [0]求值到数组的第一个元素的第一个字节。 此程序演示向指针添加整数值的效果。 #include <stdio.h> #include <string.h> int main(void) { char multiple[] = "a string"; char *p = multiple; for(int i = 0 ; i < strnlen(multiple, sizeof(multiple)) ; ++i) { printf("multiple[%d] = %c *(p+%d) = %c &multiple[%d] = %p p+%d = %p\n", i, multiple[i], i, *(p+i), i, &multiple[i], i, p+i); } return 0; } 上面的代码生成以下结果。 例3 向p中的地址添加整数n的计算结果与 multiple [n] 相同。 #include <stdio.h> int...
2024-04-03
学习C – C malloc 你也可以显式地在运行时分配内存。 你也可以显式地在运行时分配内存。… 当你使用 malloc()函数,指定内存的字节数你想要分配作为参数。 该函数返回它的内存的第一个字节的地址分配响应您的请求。 动态内存分配的一个典型示例可能是: int *pNumber = (int*)malloc(100); 这里,您请求了100字节的内存,并将此内存块的地址分配给pNumber。 以下代码分配内存以容纳25个整数。 int *pNumber = (int*)malloc(25*sizeof(int)); (int *)将函数返回的地址转换为int类型的指针。 #include <stdio.h> #include <stdlib.h> main() { char *name; name = (char *) malloc(80*sizeof(char)); if ( name != NULL ) { printf("\nEnter your name: "); gets(name); printf("\nHi %s\n", name); free(name); //free memory resources } // end if } //end main 上面的代码生成以下结果。 免费和malloc 下面的代码显示了处理内存分配失败的模式。 int *pNumber = (int*)malloc(25*sizeof(int)); if(!pNumber) { // Code to deal with memory allocation failure . . . } 释放动态分配的内存 当动态分配内存时,您需要在不再需要时释放内存。 要释放内存,只需写下这条语句: free(pNumber); pNumber = NULL; free()函数具有类型为 void * 的形式参数,你可以传递任何类型的指针作为参数。 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> int main(void) { unsigned long long *pPrimes = NULL; // Pointer to primes storage area int total = 5; // Number...
2024-04-03