转语言c++学习笔记 day 4

本文详细介绍了C++指针的基础概念,包括指针变量和内存地址的操作,如取值、赋值、数组与指针的关系,以及指针嵌套和函数参数传递。此外,还探讨了引用的概念,展示了如何直接修改引用指向的值。适合有一定编程基础的学习者作为笔记补充。
摘要由CSDN通过智能技术生成

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

指针嵌套

指针自己也是有地址的,因此可以嵌套引用。

C++ 中指向指针的指针

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值