初识指针——指针的使用

看完翁恺老师讲的指针使用这一小节,为了加深理解,来做下总结:

老师讲了在几种不同情况下,使用指针的案例

  • 当然指针作为参数传入函数,可以交换两个变量的值。

#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;
} 
  • 空间用完了

  1. 如果申请失败返回0,或者叫做NULL 
  2. 你的系统能给你多大的空间
  • free()把申请来的空间还给“系统”

    使用malloc分配的内存空间在虚拟地址空间上是连续的,但是转换到物理内存空间上有可能是不连续的,因为有可能相        邻的两个字节是在不同的物理分页上;

    使用malloc得到的内存比实际申请的内存要大一点

    malloc(0)也是可以的,每次运行会随机分配一个地址

  1. 只能还申请来的首地址 
  2. 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申请的内存空间并不连续,但是似乎差值是一定的。

猜你喜欢

转载自blog.csdn.net/jiangxiaoshan123/article/details/81513437