指针就是这么简单(更新中)

奇牛学院

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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值