【漫漫转码路】Day31C++day04-创新互联

指针 指针指向数字

存储其他变量地址的变量,称为指针;

站在用户的角度思考问题,与客户深入沟通,找到鄄城网站设计与鄄城网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都做网站、成都网站建设、成都外贸网站建设、企业官网、英文网站、手机端网站、网站推广、域名申请、虚拟空间、企业邮箱。业务覆盖鄄城地区。
int a = 25;
int *b = &a;  // 此时会报错,“int类型的值不能用于初始化int类型的实体”
// &a表示指向a的内存地址;

存储内存地址的叫指针,不能使用0以外的整型对指针赋值,因此不能指向a,只能指向a的地址
也就是&a(表示a的内存地址)

//例如
#include#include#includeusing namespace std;
int main()
{int a = 5;
	int *b = &a;
	cout<< b<< "\n";  // b得到的是a的内存地址
	cout<< *b<< "\n";  // *b得到的是内存地址存储的值
	a = 10;  //修改a
	cout<< b<< "\n";  // b获取的内存地址不变
	cout<< *b<< "\n";  // 但是内存地址对应的值变了
	*b = 8;  // 通过修改内存地址对应的数据
	cout<< a<< "\n";  // 也就是直接修改a
}
//显示
0113FACC
5
0113FACC
10
8
指针指向数组

指针指向数组不需要加&来指向他的地址

int a[5] = {1, 2, 3, 4, 5};
int *b = a;

直接指向内存中首地址,也就是索引为0的地址

//例如
#include#include#includeusing namespace std;
int main()
{	int c[5] = {1, 2, 3, 4, 5 };
	int* d = c;  // 直接指向数组开始的内存
	cout<< c[1]<< "  "<< *(d + 1);
// *(d + 1)是指针偏移,表示向右移动一位,原来在开始的位置,也就是索引为0的位置,偏移之后就到了索引为1的位置,所以能输出2
}
//显示
2 2

*(d + 1)表示是往右偏移一个单位的长度
指针不允许越界访问,就是不能超出索引

//例如
#include#include#includeusing namespace std;
int main()
{int c[5] = {1, 2, 3, 4, 5 };
	int* d = c;
	c[1] = 5;  //修改之后,两个都发生变化
	cout<< c[1]<< "  "<< *(d + 1);
}
//显示
5  5
空指针
int *a = nullptr;

空指针不指向任何地址,也不能指向任何地址,不能修改,只是一个空指针
空指针nullptr在if语句中会被当成False
NULL 或 0 也会被认为是空指针

二维数组的指针

二维及多维数组的指针需要在数组前面加强制类型转换(int *)

//例如
#include#include#includeusing namespace std;
int main()
{int c[3][3] = {{1, 2, 3},
		{4, 5, 6},
		{7, 8, 9}
	};
	int* d = (int *)c;  // 强制类型转换
	cout<< *(d + 2)<< "  "<< *(d + 3)<< "\n";  // (d + 2)是3,(d + 3)是4
	cout<< *c[1]<< "  "<< *c[1]+1;  // c是二维数组,因此一开始指针默认在数组的开始,也就是c[0][0]处,*c[1]意味着指针悬停到了第一行的开始,也就是c[1][0]处,也就是4,因此*c[1]+1表示在此基础上右偏移一个,也就是5;
}
//显示
3  4
4  5

二维数组在内存中是以行来保存的

//例如
#include#include#includeusing namespace std;
int main()
{int a[5] = {1, 2, 3, 4, 5 };
	// int* b = a;  
	int* b = &a[0];  // 与上式写法等效,也就是指针指向数组最开始的内存地址
	cout<< *(b + 3);
}
//显示
4

指针可以要求指向第几个地址;

//例如
#include#include#includeusing namespace std;
int main()
{int a[5] = {1, 2, 3, 4, 5 };
	int* b = &a[2];  // 此时指针指向索引为2的元素
	cout<< *(b + 1);  // 再次右偏
}
//显示
4 // 索引2右偏1,得到索引3
//例如
#include#include#includeusing namespace std;
int main()
{int a[5] = {1, 2, 3, 4, 5 };
	int* b = &a[2];
	*(b - 1) = 999;
	for (int i = 0; i< 5; i++)
	{cout<< a[i]<< " ";
	}
}
//显示
1 999 3 4 5  //(b - 1)是索引1,左移
引用

引用的数据成为引用变量,b就是引用变量,引用支持多个引用变量引用一个数据,以及连续引用,
修改其中哪一个,其他都将发生变化

//例如
#include#include#includeusing namespace std;
int main()
{int a = 33;
	int &b = a;
	cout<< b<< "\n";
	b = 55;
	cout<
函数

函数要先声明再使用,函数的声明需要在函数主体int main前面;

type name (argument1, argument2...) statement
type 是返回类型
name 是定义的函数名
argument是上传的参数
statement是语句

加法函数

//例如
#include#include#includeusing namespace std;
int func(int a, int b)
{int c = a + b;
	return c;
}
int main()
{int d = func(1, 3);  // 调用函数
	cout<< d;
}
//显示
4
入口参数

入口参数的隐式转换
入口参数做值拷贝,就是只有值一样,函数内部会对拷贝得到的数据进行执行运算,不会对原数据有任何影响

//例如
#include#include#includeusing namespace std;
int func(int a)
{a = 10;  // 对a进行复制,此时a是值拷贝得到的a,
	return 0;
}
int main()
{int a = 3;
	int d = func(a); // 将a= 3 传进去,会对a做值拷贝,
	cout<< d<< "\n"; // d是返回值,是return的值
	cout<< a;//调用完函数之后应该是a = 10,但那是函数内部,在函数外部的a没有改变,还是3
}
//显示
0
3
函数返回两个数

函数只能有一个数值,如果要返回两个数值,可以返回引用,或者内存地址

用引用
//例如
#include#include#includeusing namespace std;
float func(float r, float &D)  //此处引用D
{float S = 3.14 * r * r;
	D = 2 * 3.14 * r;
	return S;
}
int main()
{int a = 10;
	float d1;
	float d = func(a,d1);  // 相当于有一个&D = d1,此时D和d1是引用和被引用关系,一方被修改,则两方都被修改,而函数体中的D = 2 * 3.14 * r;就是修改D,那么d1也会被修改,那么就可以从函数体中得到另一个参数了
	cout<< d<< "\n";
	cout<< d1;
指针指向内存地址
//例如
#include#include#includeusing namespace std;
float func(float r, float *D)
{float S = 3.14 * r * r;
	*D = 2 * 3.14 * r;
	return S;
}
int main()
{int a = 10;
	float d1;
	float d = func(a, &d1);  相当于有一个*D = &d1,此时D直接指向d1的内存地址,一方被修改,则两方都被修改,而函数体中的D = 2 * 3.14 * r;就是修改D,那么d1也会被修改,那么就可以从函数体中得到另一个参数了
	cout<< d<< "\n";
	cout<< d1;
}
a和b交换值

一、利用引用

//例如
#include#include#includeusing namespace std;
void func(float &a, float &b)
{float temp = a;
	a = b;
	b = temp;
}
int main()
{float a = 2;
	float b = 3;
	func(a, b);
	cout<< a<< "\n";
	cout<< b;
}

二、利用指针指向地址

//例如
#include#include#includeusing namespace std;
void func(float *a, float *b)
{float temp = *a;
	*a = *b;
	*b = temp;
}
int main()
{float a = 2;
	float b = 3;
	func(&a, &b);
	cout<< a<< "\n";
	cout<< b;
}
空函数
int func () // 不上传参数的函数是可以存在的,一般用功能性参数
{return 1.0;
}
运算符的重载

可以存在函数名相同的函数,但是上传参数的类型或上传参数的个数不能一样
在c++中,输入1.5其实是double类型,1.5f才是float类型
double双精度浮点数

//例如
#include#include#includeusing namespace std;
void func(int a)
{cout<< "运行了整型func";
}
void func(float a)  //两个函数名一样,但是上传参数的类型不一样
{cout<< "运行了浮点型func";
}
int main()
{float a = 2;
	int b = 3;
	func(a);  //a是浮点型,调用浮点型func
	func(b);  //b是整型,调用整型func
	double c = 4;
	func(4);  // 会报错,因为没有定义双精度浮点型的func,不知道选哪一个,但是如果去掉一个func,只留一个func,就会隐式转换**
}
//显示
运行了浮点型func运行了整型func  //没有加换行

如果有两个func,不知道选哪一个,就会报错,但是如果去掉一个func,只留一个func,就会隐式转换
函数可以在int main前面声明,然后在int main后面写函数,也不会报错

缺省参数(默认参数)

函数里面可以有默认参数

//例如
#include#include#includeusing namespace std;
int func(int a,int b=5)
{int c = a + b;
	cout<< c<< "\n";
	return c;
}

int main()
{float a = 2;
	int b = 3;
	func(a);  //默认b=5
	func(a,b); // 上传参数的时候优先使用上传的参数
}
//显示
7
5
递归

递归深度是跟程序内存占据大小有关
递归实现n的阶乘

//例如
#include#include#includeusing namespace std;
int func(int n)
{if (n<= 1)
	{return 1;
	}
	return n * func(n-1);
}

int main()
{int res = func(3);
	cout<< res;
}
//显示
6

递归实现x*x+sin(x)-2求解

//例如
#include#include#includeusing namespace std;
// x*x+sin(x)-2
float func(float left, float right)
{if ((abs(left - right))< 0.00001)
	{return left;
	}
	float r_left = left * left + sin(left) - 2;
	float r_right = right * right + sin(right) - 2;
	float mid = (left + right) / 2;
	float r_mid = mid * mid + sin(mid) - 2;
	if (r_left * r_mid< 0)
	{return func(left, mid);
	}
	else
	{return func(mid, right);
	}
}

int main()
{float res = func(0, 10);
	cout<< res;
}
//显示
1.06154
void函数

无返回值的函数定义为void

静态函数

static,静态函数,在函数内部存在的变量,函数内部共享

//例如
#include#include#includeusing namespace std;
void func()
{static int a = 0;  //静态函数的初始化只会执行一次
	a++;
	cout<< a<< "\n";
}

int main()
{func();
	func();
	func();
	func();
	func();
}
//显示
1
2
3
4
5

两个函数之间的静态变量互不关联,没有影响

//例如
#include#include#includeusing namespace std;
void F2()
{static int b = 0;
	b++;
	cout<< "F2的静态函数"<< b<< "\n";
}
void F1()
{static int a = 0;
	a++;
	cout<< "F1的静态函数"<< a<< "\n";
	F2();
}


int main()
{F1();
	F1();
	F2();
}
//显示
F1的静态函数1  // F1和F2的静态函数的计数互不影响,没有关联
F2的静态函数1
F1的静态函数2
F2的静态函数2
F2的静态函数3

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网页标题:【漫漫转码路】Day31C++day04-创新互联
浏览路径:http://bzwzjz.com/article/dppege.html
Copyright © 2007-2020 广东宝晨空调科技有限公司 All Rights Reserved 粤ICP备2022107769号
友情链接: 阿坝网站设计 成都网站建设 营销型网站建设 网站建设公司 上市集团网站建设 成都网站建设 网站制作公司 成都网站制作 移动手机网站制作 手机网站制作 响应式网站设计 重庆网站设计 成都网站设计 成都网站建设 成都网站建设 盐亭网站设计 成都网站建设 成都定制网站建设 定制网站设计 手机网站制作设计 成都网站设计 移动网站建设