指针的用法

来源:互联网 发布:手机二维码扫描软件 编辑:程序博客网 时间:2024/05/18 00:49

20160728

#include<stdio.h>

#include<string.h>
#if 0
int sum(int ,int );
int main()
{
 int a=8,b=6;
 int (*p)(int,int);
 p=sum;
 printf("%d\n",p(a,b));
 return 0;
}
int sum(int a,int b )
{
 return (a+b);
}
#endif
#if 0
int main()
{
 int a[5]={1,4,7,9,14};
 int *p=a;
 printf("%d\n",*p++);//*(p++) 1 *和++的优先级一样的所以执行顺序一样从右到左
 printf("%d\n",*p): //4
 printf("%d\n",(*p)++); //4
 printf("%d\n",*p); //5 此时指向的仍然是a[1]的地址。
 printf("%d\n",*(++p)); //7
 printf("%d\n",*p): //7
 return 0;
}
#endif
#if 0

int main()
{
 int a[3][4]={1,2,3,4,5,6,7,8,9,0,11,12};
 //
 int *p=&a[0][0]; //等价于p=a[0];单指针指向了第一个元素的首地址
 int i,j;
 printf("%d,%d\n",a[1]+1,&a[1][1]);//地址是一样的
 printf("%d ,%d ,%d\n",a,a+1,&a[1]);//后面两个是等价的。
 for (p=a[0];p<a[0]+12;p++)
     printf("%d",*p);
 printf("\n");
 for (i=0,p=a[0];i<12;++i)
     printf("%d ",*(p+i)); //p[i] []可以用*+()来替代
 printf("\n");
 for (i=0;i<3;++i)
 {
  for (j=0;j<4;++j)
      printf("%3d",*(*(a+i)+j)); a[i][j]
  printf("\n");
 }
 for(i=0;i<3;++i)
 {
  for (j=0;j<4;++j)
      printf("%d ",*(p+i*4+j)); //p[i*4+j]
  printf("\n");
 }
 return 0;
}

#endif
#if 0
int main()
{
 int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
 printf("%d\n",**a); //*(*a) &a[0][0] 1
 printf("%d\n",*(*a+3)); //&a[0][3]  4
 printf("%d\n",*(*(a+1))); //&a[1][0] 5
 printf("%d\n",*(*a+1+1)); //&a[0][2] 3
 printf("%d\n",*(*(a+1+1))); //a[2][0]  9
 return 0;
}
/*
 可以看出a[i]就相当于一个 (int*)类型
*/
#endif
#if 0
int main()
{
    int a[2][3]={1,2,3,4,5,6};
    int (*p)[3]; //定义一个行指针
    int i;
    p=a;
    for (p=a;p<a+2;p++)
    {
     for (i=0;i<3;++i)
         printf("%d ",*(*p+i));
     printf("\n");
    }
 return 0;
}
#endif
#if 0
int Max(int a,int b)
{
    return a>b?a:b;
}
int Min(int a,int b)
{
    return a<b?a:b;
}
int sum(int a,int b)
{
    return a + b;
}
int sub(int a,int b)
{
    return a - b;
}
int mul(int a,int b)
{
    return a * b;
}
int Div(int a,int b)
{
    if(b != 0)
        return a / b;
}
int md(int a,int b)
{
    return a%b;
}

int main()
{
 /*
 int (*p)(int,int);
 p=Max;
 printf("%d\n",p(2,3));
 p=Div;
 printf("%d\n",p(12,5));
 */
 //可以用到一个函数指针数组 这样会很方便
 int (*p[])(int,int)={Max,Min,sum,sub,mul,Div,md};
 int n=sizeof(p)/sizeof(p[0]);
 int i;
 for (i=0;i<n;++i)
     printf("%d\n",p[i](12,4));
 return 0;
}
//这种用法叫做转移表
#endif
/*
 函数指针(指向函数的指针)
 指针函数(返回指针的函数)
*/
#if 0
/*
fun 函数,包含一个参数(int n),此函数返回一个指针,
这个指针是个函数指针,指向的函数类型为int (int ,int )
1 做另外一个函数的参数
2 作为函数的返回值
3 转移表
*/
int (*fun(int n)) (int,int);
int max(int a,int b)
{
    return a>b?a:b;
}
int main()
{
 int (*p)(int ,int);
 p=fun(100); //p=Max
 printf("%d\n",p(3,7)); //Max(3,7)
 return 0;
}
int (*fun(int n)) (int,int)
{
 printf("n=%d\n",n);
 return max;
}
#endif
#if 0
int max(int a,int b)
{
    return a>b?a:b;
}
void test(int a,int b,int (*p)(int,int))
{
 printf("%d\n",p(a,b));
}
int main()
{
 test (4,6,max);
 return 0;
}
/*
  做另外一个函数的参数
*/
#endif
/*返回值为指针的函数
 定义方法:    类型名 *函数名(参数列表)
*/
#if 0
char *fn()
{
    //char a[100];
 char *a=(char*) malloc(100);
 return a;
}
int main()
{
 char *p=fn();
 strcpy(p,"asdfg");
 puts(p);
 free(p);
 p=NULL;
 return 0;
}
#endif
/*
malloc函数的原型: void *malloc( size_t size );
开辟一段固定的连续的空间
在使用完之后应该用free函数清理掉,并且将其指向NULL,
避免内存错误的出现
realloc void *realloc( void *memblock, size_t size );
realloc 函数开辟的是动态的内存空间,是扩大或者缩小到多少
内存空间。
无论是malloc还是 realloc函数 他们所开辟的内存空间都是连续的。
*/
0 0
原创粉丝点击