看完翁恺老师讲的指针使用这一小节,为了加深理解,来做下总结:
老师讲了在几种不同情况下,使用指针的案例
-
当然指针作为参数传入函数,可以交换两个变量的值。
#include <stdio.h>
void swap(int *x,int *y);
int main()
{
int a=5,b=6;
swap(&a,&b);
printf("a=%d b=%d",a,b);
return 0;
}
void swap(int *x,int *y)
{
int t=*x;
*x=*y;
*y=t;
}
-
函数返回多个值,某些值就只能通过指针返回
-
传入的参数实际上是需要保存带回的结果的变量
#include <stdio.h>
void maxmin(int a[],int len,int *max,int *min);
int main()
{
int min,max;
int a[]={23,1,0,9,34,16,7,9,2};
maxmin(a,sizeof(a)/sizeof(a[0]),&max,&min);
printf("max=%d min=%d",max,min);
return 0;
}
void maxmin(int a[],int len,int *max,int *min)
{
*max=*min=a[0];
for(int i=0;i<len;i++)
{
if(a[i]<*min)//找出数组中的最小值
{
*min=a[i];
}
if(a[i]>*max)//找出数组中的最大值
{
*max=a[i];
}
}
}
-
函数返回运算的状态 结果通过指针返回
#include <stdio.h>
int divid(int a,int b,int *result);
int main()
{
int a=12,b=3,c;
if(divid(a,b,&c))
{
printf("%d/%d=%d\n",a,b,c);
}
return 0;
}
int divid(int a,int b,int *result)//如果除法是成功返回1,否则返回0。
{
int flag=1;
if(b==0)
{
flag=0;
}else{
*result=a/b;
}
return flag;
}
-
另外还有一点是在指针使用中经常出现的错误
定义了指针变量,还没有指向任何变量,就开始使用指针 ,可能会导致程序崩溃。
malloc动态申请内存
void *malloc(size_t size)
- 使用malloc要加头文件 #include <stdlib.h>
- 向malloc申请的空间大小是以字节为单位的。
- malloc返回的是void* ,需要类型转换为自己需要的类型
例:int *p=(int *)malloc(num*sizeof(int))
- 使用maloc结束之后必须要用free函数释放内存。
int main() { int n; scanf("%d",&n); int *p=0; p=(int *)malloc(n*sizeof(int)); for(int i=0;i<n;i++) { scanf("%d",&p[i]); } for(int i=n-1;i>=0;i--) { printf("%d ",p[i]); } free(p); return 0; }
空间用完了
- 如果申请失败返回0,或者叫做NULL
- 你的系统能给你多大的空间
free()把申请来的空间还给“系统”
使用malloc分配的内存空间在虚拟地址空间上是连续的,但是转换到物理内存空间上有可能是不连续的,因为有可能相 邻的两个字节是在不同的物理分页上;
使用malloc得到的内存比实际申请的内存要大一点
malloc(0)也是可以的,每次运行会随机分配一个地址
- 只能还申请来的首地址
- free(NULL)是可以的
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *p=0;
char *q=0;
char *r=0;
p=(char *)malloc(2);
q=(char *)malloc(2);
r=(char *)malloc(0);
for(int i=0;i<3;i++)
{
scanf("%d",&p[i]);
}
for(int i=0;i<3;i++)
{
printf("%d\n",p[i]);
}
printf("p=%p\n",p);
printf("q=%p\n",q);
printf("r=%p\n",r);
free(p);
free(q);
free(r);
return 0;
}
两次使用malloc申请的内存空间并不连续,但是似乎差值是一定的。