第七章-指针学习

指针变量的定义和使用

#include <iostream>
using namespace std;

int main(){
	
	//1、指针的定义
	
	int a = 10;//定义整型变量a
	
	//指针定义语法:数据类型 * 变量名
	int * p;
	
	//指针变量赋值
	p = &a;//指针指向变量a的地址
	cout << &a << endl;//数据a的地址
	cout << p << endl; //打印指针变量p
	
	//指针的使用
	//通过*操作指针变量指向的内存
	cout << "*p = " << *p << endl;
	
	//对内容修改
	*p = 100;
	cout << "*p = " << *p << endl;
	cout << "a = " << a << endl; 
	
	return 0;
	 
}

指针所占内存空间

#include <iostream>
using namespace std;

int main(){
	//指针所占内存空间
	int a = 10;
	int * p = &a;
	
	//在32位操作系统下,指针是占4个字节,64位操作系统下是8个字节 
	cout << "sizeOf(int *)=" << sizeof(int *) << endl;
	cout << "sizeOf(int *)=" << sizeof(float *) << endl;
	cout << "sizeOf(int *)=" << sizeof(double *) << endl;
	cout << "sizeOf(int *)=" << sizeof(char *) << endl;
	return 0;
	
}

空指针

#include <iostream>
using namespace std;

int main(){
	
	//空指针:指针变量p指向内存地址编号为0的空间
	//用途:初始化指针变量
	//注意:空指针指向的内存是不可以访问的 
	int * p;
	 
	cout << *p << endl;
	
	return 0;
	 
} 

野指针

#include <iostream>
using namespace std;

int main(){
	
	//野指针;指针变量指向非法的内存空间
	//例如
	int * p = (int *)0x1100;
	
	//访问野指针会异常
	cout << *p << endl;
	
	return 0; 
}

const修饰指针

#include <iostream>
using namespace std;

int main(){
	
	/*const修饰指针的三种情况:
	1、const修饰指针 --常量指针:指针的指向可以修改,但是指针指向的值不可以改 
	2、const修饰常量 --指针常量:指针的指向不可以改,指针指向的值可以改 
	3、const既修饰指针又修饰常量 :指针的指向和指针指向的值都不可以改 
	 */
	int a = 10;
	int b = 10;
	
	const int * p = &a;
	
	//*p=20;错误 
	p=&b;
	
	int * const p2 = &a;
	*p2 = 100;
	//p2=&b;错误 
	
	const int * const p3 = &a;
	//*p3=100;错误 
	//p3=&b;错误 
	
	return 0;
} 

指针和数组

#include <iostream>
using namespace std;

int main(){
	int arr[] = {1,2,3,4,5,6,7,8,9,10};
	
	int * p = arr;//数组名就是数组首地址
	
	cout << "第一个元素:" << arr[0] << endl;
	cout << "指针访问第一个元素:" << *p << endl;
	
	for(int i=0;i<10;i++){
		
		//利用指针遍历数组
		cout << *p << endl;
		p++; 
	}
	
	return 0; 
} 

动态数组

利用动态数组解决之前统计学生考试成绩均值和均方差的问题

#include <iostream>
#include <cmath>
using namespace std;

int main(){
	int *score, num, i;
	double average = 0, variance = 0;
	
	//输入阶段
	cout << "请输入参加考试的人数:";
	cin >> num;
	score = new int[num];//动态数组
	
	cout << "请输入成绩:\n";
	for(i=0;i<num;++i){
		cin >> score[i];
	}
	 
	//计算平均成绩
	for(i=0;i<num;++i){
		average += score[i];
	} 
	average = average / num;
	
	//计算均方差
	for(i=0;i<num;++i){
		variance += (average - score[i]) * (average - score[i]);
	} 
	variance = sqrt(variance)/num;
	
	cout << "平均分是:" << average << "\n均方差是:" << variance << endl;
	
	return 0;
} 

在这里插入图片描述

指针函数

#include <iostream>
using namespace std;

void swap1(int a,int b);
void swap2(int *p1,int *p2);

//利用指针作函数参数,可以修改实参的值 
int main(){
	
	int a=10;
	int b=20;
	//值传递 
	swap1(a,b);
	cout << "a=" << a << endl;
	cout << "b=" << b << endl;
	
	cout << "==========" << endl;
	
	//地址传递 
	swap2(&a, &b); 
	
	cout << "a=" << a << endl;
	cout << "b=" << b << endl;
	
	return 0;
} 

void swap1(int a,int b){
	int temp = a;
	a=b;
	b=temp;
}

void swap2(int *p1,int *p2){
	int temp = *p1;
	*p1=*p2;
	*p2=temp;
}

利用指针作为参数传递可以使函数有多个执行结果

例如:解一元二次方程的函数及其应用

#include <iostream>
#include <cmath>
using namespace std;

int SolveQuadratic(double a, double b, double c, double *px1, double *px2);//两个指针分别存放两个解 

int main(){
	double a,b,c,x1,x2;
	int result;
	cout << "请输入a,b,c:";
	cin >> a >> b >> c;
	
	result = SolveQuadratic(a,b,c,&x1,&x2);
	switch(result){
		case 0: cout << "方程有两个不同的根:x1=" << x1 << " x2=" << x2; break;
		case 1: cout << "方程有两个相等的根:x1=x2=" << x1; break;
		case 2: cout << "方程无解"; break;
		case 3: cout << "不是一元二次方程"; 
	}
	return 0; 
}


int SolveQuadratic(double a, double b, double c, double *px1, double *px2){
	double disc, sqrtDisc;
	
	if(a==0)
		return 3;//不是一元二次方程
	disc = b*b-4*a*c;
	if(disc<0)
		return 2;//无根
	if(disc==0){
		*px1 = -b/(2*a);
		return 1;//等根 
	}
	//两个不等根
	sqrtDisc = sqrt(disc);
	*px1 = (-b+sqrtDisc)/(2*a);
	*px2 = (-b-sqrtDisc)/(2*a);
	return 0; 
}

在这里插入图片描述

分治法寻找整型数组中的最大最小值,存放在指针中

#include <iostream>
using namespace std;

void minmax(int a[], int n, int *min_ptr, int *max_ptr);

int main(){
	
	int a[] = {4,5,1,2,3,9,8,7,0,6};
	int n=sizeof(a)/sizeof(a[0]);
	int min, max;
	minmax(a,n,&min,&max);
	cout << "最大值是:" << max << " 最小值是:" << min << endl; 
	return 0;
}

void minmax(int a[], int n, int *min_ptr, int *max_ptr){
	int min1, max1, min2, max2;
	
	switch(n){
		case 1: *min_ptr = *max_ptr = a[0]; return;
		case 2: if(a[0]<a[1]){
			*min_ptr=a[0];
			*max_ptr=a[1];
		}else{
			*min_ptr=a[1];
			*max_ptr=a[0];
		}
		return;
		default:minmax(a,n/2,&min1,&max1);//找前一半的最大值、最小值
				minmax(a+n/2,n-n/2,&min2,&max2);//找后一半的最大值、最小值
				if(min1<min2) *min_ptr=min1; else *min_ptr=min2;
				if(max1>max2) *max_ptr=max1; else *max_ptr=max2;
				return;
	}
}

在这里插入图片描述

字符串作为函数的参数

#include <iostream>
using namespace std;
int word_cnt(const char *); 

int main(){
	
	char sentence[80];
	cin.getline(sentence,80);
	const char *s = sentence;
	int res = word_cnt(s);
	cout << "单词个数为:" << res << endl;
	return 0;
}

int word_cnt(const char *s){
	int cnt = 0;
	while(*s != '\0'){
		while(*s == ' ') ++s; //跳过空白字符
		if(*s !='\0'){
			++cnt; //找到一个单词
			while(*s !=' ' && *s !='\0') ++s;//跳过单词 
		} 
	}
	return cnt;
}

在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值