day 4
前言:
由于本人有其他语言编程基础,所以对大部分c++较为基础的内容不做笔记。只记录个人之前不熟悉的知识点,此系列文章**不适合新手学习,仅做个人笔记记录。**同时由于本人对c++不熟悉,可能会有理解错误的地方,欢迎大佬来指出错误。
部分学习内容取自菜鸟教程
指针
概念
对于指针变量a:
*a为取指针a所指向的值
对于变量a:
&a为取变量a所在的地址
int var = 20; // 实际变量的声明
int *ip; // 指针变量的声明
ip = &var; // 在指针变量中存储 var 的地址
cout << "Value of var variable: ";
cout << var << endl;
// 输出在指针变量中存储的地址
cout << "Address stored in ip variable: ";
cout << ip << endl;
// 访问指针中地址的值
cout << "Value of *ip variable: ";
cout << *ip << endl;
Value of var variable: 20
Address stored in ip variable: 0xbfc601ac
Value of *ip variable: 20
运算与赋值
对于指针a来说,可以进行++、–等操作,表示所指向的地址的变更。
int var[MAX] = {10, 100, 200};
int *ptr;//指针
// 指针中的数组地址
ptr = var;
for (int i = 0; i < MAX; i++)
{
cout << "Address of var[" << i << "] = ";
cout << ptr << endl;
cout << "Value of var[" << i << "] = ";
cout << *ptr << endl;
// 移动到下一个位置
ptr++;
}
Address of var[0] = 0xbfa088b0
Value of var[0] = 10
Address of var[1] = 0xbfa088b4
Value of var[1] = 100
Address of var[2] = 0xbfa088b8
Value of var[2] = 200
同样,指针也可以比较大小。
在上述的例子之中var[0]的指针变量大小是小于var[2]的,即:
a = &var[0];
b = &var[1];
cout<<bool(a<b);//1
同样,可以通过指针对数组进行赋值:
&(var+2) = 500;
cout<<var[2];//500
指针数组
以指针为元素的数组
int var[MAX] = {10, 100, 200};
int *ptr[MAX];
for (int i = 0; i < MAX; i++)
{
ptr[i] = &var[i]; // 赋值为整数的地址
}
for (int i = 0; i < MAX; i++)
{
cout << "Value of var[" << i << "] = ";
cout << *ptr[i] << endl;
}
Value of var[0] = 10
Value of var[1] = 100
Value of var[2] = 200
指针嵌套
指针自己也是有地址的,因此可以嵌套引用。
int var;
int *ptr;
int **pptr;
var = 3000;
// 获取 var 的地址
ptr = &var;
// 使用运算符 & 获取 ptr 的地址
pptr = &ptr;
// 使用 pptr 获取值
cout << "var 值为 :" << var << endl;
cout << "*ptr 值为:" << *ptr << endl;
cout << "**pptr 值为:" << **pptr << endl;
var 值为 :3000
*ptr 值为:3000
**pptr 值为:3000
向函数传递指针
我们都知道,向函数传入一个值之后,对其进行任何操作是无法对原函数之中的值进行改变的。
void myMinus(int a)
{
a--;
return;
}
int main ()
{
int a = 1;
myMinus(a);
cout<<a;
return 0;
}
//1
但是如果是传入一个地址,在函数中对地址所在的值进行更改,是可以达到对原函数之中的值进行修改的目的的。
void myMinus(int * a)
{
(*a)--;
return;
}
int main ()
{
int a = 1;
myMinus(&a);
cout<<a;
return 0;
}
//0
函数返回值为指针
之前的学习笔记中有提到,随机数的例子。
// 要生成和返回随机数的函数
int * getRandom( )
{
static int r[10];
// 设置种子
srand( (unsigned)time( NULL ) );
for (int i = 0; i < 10; ++i)
{
r[i] = rand();
cout << r[i] << endl;
}
return r;
}
// 要调用上面定义函数的主函数
int main ()
{
// 一个指向整数的指针
int *p;
p = getRandom();
for ( int i = 0; i < 10; i++ )
{
cout << "*(p + " << i << ") : ";
cout << *(p + i) << endl;
}
return 0;
}
引用
直接取到数值来源的地址,可直接对相应的地址的数值进行修改
函数传入引用
int main ()
{
// 局部变量声明
int a = 100;
int b = 200;
cout << "交换前,a 的值:" << a << endl;
cout << "交换前,b 的值:" << b << endl;
/* 调用函数来交换值 */
swap(a, b);
cout << "交换后,a 的值:" << a << endl;
cout << "交换后,b 的值:" << b << endl;
return 0;
}
void swap(int& x, int& y)
{
int temp;
temp = x; /* 保存地址 x 的值 */
x = y; /* 把 y 赋值给 x */
y = temp; /* 把 x 赋值给 y */
return;
}
交换前,a 的值: 100
交换前,b 的值: 200
交换后,a 的值: 200
交换后,b 的值: 100
函数返回引用
double vals[] = {10.1, 12.6, 33.1, 24.1, 50.0};
double& setValues(int i) {
double& ref = vals[i];
return ref; // 返回第 i 个元素的引用,ref 是一个引用变量,ref 引用 vals[i]
}
// 要调用上面定义函数的主函数
int main ()
{
cout << "改变前的值" << endl;
for ( int i = 0; i < 5; i++ )
{
cout << "vals[" << i << "] = ";
cout << vals[i] << endl;
}
setValues(1) = 20.23; // 改变第 2 个元素
setValues(3) = 70.8; // 改变第 4 个元素
cout << "改变后的值" << endl;
for ( int i = 0; i < 5; i++ )
{
cout << "vals[" << i << "] = ";
cout << vals[i] << endl;
}
return 0;
}
改变前的值
vals[0] = 10.1
vals[1] = 12.6
vals[2] = 33.1
vals[3] = 24.1
vals[4] = 50
改变后的值
vals[0] = 10.1
vals[1] = 20.23
vals[2] = 33.1
vals[3] = 70.8
vals[4] = 50