奇牛学院
1.为什么要使用指针
1.1 函数的值传递,形式参数的结果没法传回到主参
#include <iostream>
#include <Windows.h>
using namespace std;
//值传递,没法传回到主参
void add_blood(int blood){
blood+=1000;
}
int main(void){
int rock = 1000;
add_blood(rock);
cout<<"rock's blood is: "<<rock<<endl;
system("pause");
return 0;
}
1.2 被调用函数,没法提供更多的返回值,给调用参数
#include <iostream>
#include <Windows.h>
using namespace std;
bool add_blood(int blood){
if(blood<=10000){
blood+=1000;
return true;
}else{
return false;
}
//假设需要返回血量blood,则无法返回
}
int main(void){
int rock = 1000;
add_blood(rock);
cout<<"rock's blood is: "<<rock<<endl;
system("pause");
return 0;
}
1.3 减少值传递的额外开销,提高执行效率
#include <iostream>
#include <Windows.h>
#include <time.h>//时间戳
#include <string.h>
using namespace std;
struct _hero{
char name[16];
int blood;
int power;
int level;
};
//rock's blood is: 1215752192
//时间一共用了: 7秒
struct _hero _hero_add(struct _hero hero, int type){
switch(type){
case 1://攻击型的英雄
hero.blood += 1000;
hero.power += 200;
hero.level++;
break;
case 2://防御型的英雄
hero.blood += 1000;
hero.power += 50;
hero.level++;
break;
default: break;
}
return (hero);
};
//1秒
void _hero_add1(struct _hero *hero, int type){
switch(type){
case 1://攻击型的英雄
hero->blood += 1000;
hero->power += 200;
hero->level++;
break;
case 2://防御型的英雄
hero->blood += 1000;
hero->power += 100;
hero->level++;
break;
default: break;
}
}
int main(void){
time_t start,end;
struct _hero rock;
strcpy(rock.name,"Rock");
rock.blood = 1000;
rock.level = 10;
time(&start);
for(int i=0; i<99999999; i++){
rock = _hero_add(rock,1);
//_hero_add1(&rock,1);
}
time(&end);
cout<<"rock's blood is: "<<rock.blood<<endl;
cout<<"时间一共用了: "<<end-start<<"秒"<<endl;
system("pause");
return 0;
}
---------------------------------------------------------------------------------------------------------------------------------
2.1 指针的定义:
int *p;
int* p,a;//p是指针变量,a是整形变量
int * p;
#include <iostream>
#include <Windows.h>
using namespace std;
int main(void){
int *p;
int a = 2;
p=&a;
cout<<*p<<endl;
system("pause");
return 0;
}
---------------------------------------------------------------------------------------------------------------------------------
3.1 指针的访问
#include <iostream>
#include <Windows.h>
using namespace std;
int main(void){
int room = 4;
int *p = &room;
printf("room的值为: %d\n",*p);
int *p1 = p;
printf("room的值为: %d\n",*p1);
printf("room的地址为: OX%p\n",&room);
printf("room的地址为: OX%p\n",p);
printf("room的地址为: OX%p\n",p1);
printf("room的地址为: OX%p\n",&room);//在32位系统下,不足8位的,在前补零
printf("room的地址为: OX%x\n",p);//地址小写
printf("room的地址为: OX%X\n",p1);//地址大写
*p = 6;// 等价于 room = 6;
printf("room的值为: %d\n",room);
system("pause");
return 0;
}
---------------------------------------------------------------------------------------------------------------------------------
4.1 空指针和坏指针
4.1.1 指针不赋初值,用指针形式输出,会导致程序直接崩溃。
解决办法:让指针直接初始化为NULL或为0,一般都使用NULL。
当指针使用完后时,建议直接将指针置为空指针NULL。
#include <iostream>
#include <Windows.h>
using namespace std;
int main(void){
int room1 = 666;
int room2 = 888;
int a;
int *p;
cin>>a;
if( a == 666 ){
p = &room1;
}else if( a == 888 ){
p = &room2;
}
//若a为其它的值,则*p为坏指针。
cout<<"选择的是: "<<*p<<endl;//例如a的值不是666和888,就会导致程序崩溃
system("pause");
return 0;
}