为什么要使用指针
我们首先引入一个例子:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a;
a= 10;
int *p;
p = &a;
printf ("a address is %p\n",&a);
printf ("a address is %p\n",p);
system("pause");
return 0;
}
a的地址是系统随机分配的那么我们如果想要把数据存储在指定地址呢?
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a;
a= 10;
int *p;
p = &a;
printf ("a address is %p\n",&a);
printf ("a address is %p\n",p);
int *p2 = (int * )0x0060ff00;
*p2 = 10;
printf("在内存的%p位置,存放值是%d\n",p2,*p2);
system("pause");
return 0;
}
另外假若我们通过编写一个函数要交换两个数据“”
#include <stdio.h>
#include <stdlib.h>
void swap(int a, int b)
{
int tmp;
tmp = a;
a = b;
b = tmp;
}
int main()
{
int main ()
int a = 10;
int b = 5;
swap(a,b);
printf ("a=%d\n",a) ;
printf ("b=%d\n",b);
system("pause");
return 0;
}
我们观察是否能够实现交换
结果是否定的,那我们再换一种方式呢?
#include <stdio.h>
#include <stdlib.h>
void swap(int *a, int *b)
{
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
int main()
{
int main ()
int a = 10;
int b = 5;
swap(&a,&b);
printf ("a=%d\n",a) ;
printf ("b=%d\n",b);
system("pause");
return 0;
}
结果:
为什么呢?我们在引入一个例子:
#include <stdio.h>
#include <stdlib.h>
void jiajiaA(int a)
{
a = a+1;
printf("jia:a = %d\n",a) ;
}
int main ()
{
int a = 10;
jiajiaA(a) ;
printf ( "a=%d\n",a) ;
}
system ( "pause" ) ;
return 0;
我们观察自定义函数和主函数中的结果是否一致:
显而易见不一致,那我们在这里说以下内存的过程:
假设我们有一栋楼,我们在三楼某个房间里存放着主函数里的a=10, 那我们知道函数调用以后被调用的时候形参才存在 ,虽然两个都是a,但是在内存中是两码事,也就是说在其他房间也有一个a = 10(假设在第四层某个房间),函数调用的时候就是用的第四层的a进行计算,而对于主函数,调用的仍是第三层的a,函授调用以后第四层的a就不存在了,第三层的a从头到尾都没没有动过。
那么我们怎么才能改变第三层的值呢:
#include <stdio.h>
#include <stdlib.h>
void jiajiaA(int *p)
{
*p = *p+1;
printf("jia:a = %d\n",*p) ;
}
int main ()
{
int a = 10;
jiajiaA(&a) ;
printf ( "a=%d\n",a) ;
}
system ( "pause" ) ;
return 0;
我们再看结果:
我们再来解析:
#include <stdio.h>
#include <stdlib.h>
void jiajiaA(int *p)//定义指针p
{
*p = *p+1;//取出a的内容
printf("jia:a = %d\n",*p) ;
}
int main ()
{
int a = 10;
jiajiaA(&a) ;//此时传过去的是a的地址
printf ( "a=%d\n",a) ;
}
system ( "pause" ) ;
return 0;
调用结束以后p不存在了,a的值也发生了改变。