扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
存储其他变量地址的变量,称为指针;
站在用户的角度思考问题,与客户深入沟通,找到鄄城网站设计与鄄城网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都做网站、成都网站建设、成都外贸网站建设、企业官网、英文网站、手机端网站、网站推广、域名申请、虚拟空间、企业邮箱。业务覆盖鄄城地区。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元起,快前往官网查看详情吧
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流