关于指针的小结2

 
 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);
}
 
 
未完,待续 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值