标签:
66.编写字符串复制的程序(用指针变量处理).
1 #include <stdio.h> 2 3 void main(void) 4 { 5 char a[50], b[80], *p, *q; 6 7 p = a; 8 q = b; 9 printf("Input data: "); 10 gets(a); 11 while (*p != ‘\0‘) 12 *q++ = *p++; 13 *q = ‘\0‘; 14 puts(b); 15 }
Mark:
复制操作结束后,需要在b数组有效字符后面添加"\0",否则在按字符串输出b数组时会出现乱码.
67.编写字符串连接的程序(用指针变量处理).
1 #include <stdio.h> 2 3 void main(void) 4 { 5 char a[80], b[30], *p, *q; 6 7 p = a; 8 q = b; 9 gets(a); 10 gets(b); 11 while (*p != ‘\0‘) 12 p++; 13 while (*q != ‘\0‘) 14 *p++ = *q++; 15 *p = ‘\0‘; 16 puts(a); 17 }
68.(1)定义一个二维数组a[3][2].
C语言规定,a表示a[0][0]的地址,a+1表示下一行第一个元素a[1][0]的地址,而a+2表示a[2][0]的地址.
int (*p)[2]定义为p为行指针,p的变化是按行进行的,放[]里的取值必须与指针变量p所指的数组的列数(即数组每行元素的个数).
如果p不指向a或者定义(*p)[2]中,[]中的值与a数组的列不相同,这时不能用p[i][j]代替a[i][j].
(2)C语言在处理二维数组时,将其看成一个包含特殊元素的一维数组,而这特殊元素既是一个一维数组.如有了定义"char a[3][4];"后,可将二维数组a看作是由3个元素a[0],a[1],a[2]组成的一维数组,而每个元素又可以看作是存放4个字符的一维数组.
C语言规定,a[0],a[1],a[2]分别代表第一,第二,第三行的首地址,因此程序"for (i = 0; i < 3; i++) puts(a[i]);"等价于"for (p = a; p < a + 3; p++) puts(p);".
69.int a[3][2], (*p)[2]; p = a;
(1)二维数组a元素可分别用以下形式表示:
a[i][j], p[i][j], (*(a+i))[j], *(a[i]+j), *(p[i]+j), *(*(a+i)+j), *(*(p+i)+j).(其中0 <= i < 3, 0 <= j < 2)
(2)二维数组a元素的地址可分别用以下形式表示:
&a[i][j], &p[i][j], &((*(a+i))[j]), &((*(p+i))[j]), a[i]+j, p[i]+j, *(a+i)+j, *(p+i)+j.(其中0 <= i < 3, 0 <= j < 2)
70.编写函数myswap1,该函数实现两个数值的交换.
1 #include <stdio.h> 2 3 void myswap1 (int x, int y) 4 { 5 int z; 6 z = x; 7 x = y; 8 y = z; 9 } 10 11 void main (void) 12 { 13 int x = 3, y = 5; 14 15 printf("Before: x = %d, y = %d\n", x, y); 16 myswap1(x, y); 17 printf("After: x = %d, y = %d\n", x, y); 18 }
结果:
Before: x = 3, y = 5
After: x = 3, y = 5
解释:
当执行语句"myswap1(x, y);"的时候,程序的流程转到myswap1函数,这时系统又为两个形参x,y分配两个存储单元,同时把实参x,y的值3和5分别传递给对应的形参x,y,在被调函数中交换形参x和y的值,当遇到函数最后的"}"时调用结束,形参x,y所占的存储单元被释放,形参x,y消失.函数调用完毕,流程回到main函数中调用myswap1函数的地方,然后继续执行其后面的语句,输出x和y的值3和5.
在C语言中数据是"按值"单向传递的,即数据只能从实质单方向传递给形参,形参值的改变不会反向影响对应实参的值.不过,当形参是能指向实参的指针变量时,形参可以影响实参.重新编写函数myswap2如下.
1 #include <stdio.h> 2 3 void myswap2 (int *x, int *y) 4 { 5 int z; 6 z = *x; 7 *x = *y; 8 *y = z; 9 } 10 11 void main (void) 12 { 13 int x = 3, y = 5; 14 15 printf("Before: x = %d, y = %d\n", x, y); 16 myswap2(&x, &y); 17 printf("After: x = %d, y = %d\n", x, y); 18 }
结果:
Before: x = 3, y = 5
After: x = 5, y = 3
71.编写函数,求1-1/2+1/3-1/4+...-1/n的值.
1 #include <stdio.h> 2 3 float mycal (int n); 4 5 void main (void) 6 { 7 int n; 8 float sum; 9 10 printf("Input data: "); 11 scanf("%d", &n); 12 sum = mycal(n); 13 printf("1-1/2+1/3-1/4+...-1/n = %f\n", sum); 14 } 15 16 float mycal (int n) 17 { 18 int i, sign = 1; 19 float sum = 0.0; 20 21 for (i = 1; i <= n; i++) 22 { 23 sum = sum + (float)sign / i; 24 sign = -sign; 25 } 26 return sum; 27 }
虽然mycal函数的定义在主函数之后,但因为前面有函数原型说明"float mycal (int n);",所以允许调用该函数,原型说明采用"先复制该函数首部,再加一个分号"方法.
标签:
原文地址:http://www.cnblogs.com/zero-jh/p/5029275.html