文章目录
指针变量的定义和使用
#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;
}