4.编写下列函数:
当传递两个变量的地址时,swap函数应该交换两个变量的值:
#include
void swap(int *p, int *q);
int main(void)
{
int i, j, *m, *n;
scanf("%d %d", &i, &j);
m = &i;
n = &j;;
swap(m, n);
printf("%d %d\n", i, j);
return 0;
}
void swap(int *p, int *q)
{
int t;
t = *p;
*p = *q;
*q = t;
}
8.编写下列函数:
当传入长度为n的数组a时,函数将返回指向数组最大元素的指针。
#include
12.编写下面的函数:
a指向长度为n的数组。函数从数组中找出最大和第二大的元素,并把它们分别存储到由largest和second_largest指向的变量中。要求使用指针算术运算而不是取下标来访问数组元素。
正确做法:#include
#define N 10
void find_two_largest(int a[], int n, int *largest, int *second_largest);
int main(void)
{
int i, n, *p, *q, a[N];
scanf("%d", &n);
for(i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
p = NULL;
q = NULL; // 指针一定要初始化, 要不然这两处会出现两个warnning;
find_two_largest(a, n, p, q);
return 0;
}
void find_two_largest(int a[], int n, int *largest, int *second_largest)
{
int i, mark1, mark2;
mark1 = 0; //用mark来标记下标
mark2 = 0;
for(i = 0; i < n; i++)
{
if(a[mark1] < a[i])
{
mark1 = i;
}
}
largest = &a[mark1];
for(i = 0; i < mark1; i++)
{
if(a[i] != a[mark1] && a[mark2] < a[i])
{
mark2 = i;
}
}
for(i = mark1 + 1; i < n; i++)
{
if(a[i] != a[mark1] && a[mark2] < a[i])
{
mark2 = i;
}
}
second_largest = &a[mark2];
printf("%d %d\n", *largest, *second_largest);
}
错误做法!!!!!!!
#include
void find_two_largest(int a[], int n, int *largest, int *second_largst);
int main(void)
{
int a[10], i, n, *p, *q;
scanf("%d", &n);
for(i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
p = &a[0];
q = &a[0];
find_two_largest(a, n, p, q);
return 0;
}
void find_two_largest(int a[], int n, int *largest, int *second_largest)
{
int i, m;
for(i = 0; i < n; i++)
{
if(*largest < a[i])
{
*largest = a[i]; //这种思路从一开始就是错的,因为*largest -> a[0]的值, 因此就会改变a[0], 的值,所以此种做法是错误的。
m = i;
}
}
for(i = 0; i < m; i++)
{
if(*second_largest < a[i])
{
*second_largest = a[i];
}
}
for(i = m + 1; i < n; i++)
{
if(*second_largest < a[i])
{
*second_largest = a[i];
}
}
printf("%d %d\n", *largest, *second_largest);
}