3) #include <stdio.h>
void swap(int *x, int *y)
结果:5,3
{
int *t;
//地址随机,很危险,会破坏整个系统。应改成
*t = *x; //int w,*t;
*x = *y;
// t=&w;
*y = *t;
}
void main ()
{
int a=3,b=5;
swap(&a, &b);
printf(“%d,%d”,a,b);
}
总结:C语言中实参变量和形参变量之间的数据传递是单向的“值传递”方式,不可能通过调用函数来改变
实参指针变量的值,但可以改变实参指针变量
所指向变量的值。
b)
指针引用一维数组元素:输出一维数组中全部元素:
1.void main()
{
int a[10];
int i;
for(i=0; i<10; i++)
scanf(“%d”,&a[i]);
for(i=0; i<10; i++)
printf(“%d”, a[i]);
}
2. void main()
{
int a[10];
int i;
for(i=0; i<10; i++)
scanf(“%d”,&a[i]);
for(i=0; i<10; i++)
printf(“%d”, *(a+i));
}
3. void main()
{
int a[10];
int i;
int *p=a;
for(i=0; i<10; i++)
scanf(“%d”,&p[i]);
for(i=0; i<10; i++)
printf(“%d”, p[i]);
}
4. void main()
{
int a[10];
int i;
int *p=a;
for(i=0; i<10; i++)
scanf(“%d”,p+i);
for(i=0; i<10; i++)
printf(“%d”, *(p+i));
}
5. void main()
{
int a[10];
int i;
int *p=a;
for(i=0; i<10; i++)
scanf(“%d”,&p[i]);
for(p=a; p<a+10; p++)
printf(“%d”, *p);
}
6. void main()
{
int a[10];
int i;
int *p=a;
for(i=0; i<10; i++)
scanf(“%d”,&p[i]);
for(i=0; i<10; i++)
printf(“%d”, p[i]);
}
7. void main()
{
int a[10];
int i;
int *p=a;
for(i=0; i<10; i++)
scanf(“%d”,p++);
p=a;
for(i=0; i<10; i++,p++)
printf(“%d”, *p);
}
8. void main()
{
int a[10];
int i;
int *p=a;
for(i=0; i<10; i++)
scanf(“%d”,&p[i]);
while(p<a+10)
printf(“%d”, *p++);
}
总结:1,2,3,4的效率是一样的,象5这样的p++的自加操作是比较快的。不必每次计算地址。
要注意指针的当前值。(如7)
数组名是常量指针。不可以做自增,自减运算。
c)
数组名和指针作为函数参数:将数组中
n
个整数按相反顺序存放:
1.
#include <stdio.h>
void inv(int x[], int n);
void main()
{
int i;
int a[5];
int *p = NULL; //指针的用法:a.申请指针赋NULL
p = a; // b.赋值后判断是否为空
// c.使用完后释放指针空间
if(p != NULL) // p = NULL
for(i=0; i<5; i++)
scanf("%d,", p++);
inv(a, 5);
p = a;
for(i=0; i<5; i++)
printf("%d,", *p++);
p = NULL;
}
void inv(int x[], int n)
// C编译都是将形参数组名作为指针变量来处理,相当于inv(int *x, int n)
{
//这样可以改变实参数组元素的值。
int m;
int temp;
int i, j;
m=(n-1)/2;
for(i=0; i<=m; i++)
{
j = n-1-i;
temp = x[i];
x[i] = x[j];
x[j] = temp;
}
}
2.
#include <stdio.h>
void inv(int *x, int n);
void main()
{
int i;
int a[5]={1, 2, 3, 4, 5};
int *p = NULL;
p = a;
inv(p, 5);
if(p != NULL)
for(i=0; i<5; i++)
printf("%d,", *p++);
printf("/n");
p = NULL;
}
void inv(int *x, int n)
// 等同于void inv(int x[ ], int n),二者形
{
//式不同,但都是指针变量做形参
int m;
int temp;
int *p, *i, *j;
m = (n-1)/2;
i = x;
j = x+n-1;
p = x+m;
for(i=x; i<=p; i++,j--)
{
temp = *i;
*i = *j;
*j = temp;
}
}
d)
指向函数的指针
#include <stdio.h>
int max(int x, int y);
int min(int x, int y);
int sum(int x, int y);
void process(int x, int y, int (*p)(int x, int y));
void main()
{
int a, b;
a=2;
b=3;
process(a, b, max);
process(a, b, min);
process(a, b, sum);
}
int max(int x, int y)
{
int z;
if(x>y)
z = x;
else
z = y;
return z;
}
int min(int x, int y)
{
int z;
if(x<y)
z = x;
else
z = y;
return z;
}
int sum(int x, int y)
{
int sum1 = 0;
sum1 = x + y;
return sum1;
}
void process(int x, int y, int(*p)(int x, int y))
{
int z;
z = (*p)(x,y);
printf("%d/n", z);
}
未完,待续