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函数 他们所开辟的内存空间都是连续的。
*/