C++ 指针与引用

C++ 指针

指针的定义

指针是一个变量,它的值是另一个变量的地址,即内存位置的直接地址。

指针变量的一般声明形式:

type *var-name;

int *ip;
double *dp;
float *fp;
char *ch;
  • 所有指针的值的实际数据类型都是一样的,一个代表内存地址的十六进制数。指针变量声明的不同数据类型,是所指向的变量或常量的数据类型。

指针的使用

#include <iostream>

using namespace std;

int main ()
{
    int  var = 20;   // 实际变量的声明
    int  *ip;        // 指针变量的声明

    ip = &var;       // 在指针变量中存储 var 的地址

    cout << "Value of var variable: ";
    cout << var << endl;                      //20

    // 输出在指针变量中存储的地址
    cout << "Address stored in ip variable: ";
    cout << ip << endl;                       //0xbfc601ac

    // 访问指针中地址的值
    cout << "Value of *ip variable: ";
    cout << *ip << endl;                      //20
    return 0;
}
  • 把变量地址赋值给指针 ip = &var
  • 访问指针变量中保存的变量的值,使用 *ip

Null 指针

在声明指针变量时,如果没有确切的地址可以赋值,则应该为指针变量赋一个 NULL 值。NULL指针是一个定义在标准库中,值为0的常量。

#include <iostream>

using namespace std;

int main ()
{
   int  *ptr = NULL;
   cout << ptr ;  // 0
   return 0;
}

指针与数组

指针和数组在很多情况下是可以互换的,可以通过指针的算术运算或数组索引来访问数组。

#include <iostream>
 
using namespace std;
const int MAX = 3;
 
int main ()
{
   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++;
   }
   return 0;
}
  • 通过指针的算术运算来访问数组,ptr每增加一次,指向的地址位置增加4 (int类型占4个字节),即指向下一个整数。
  • 数组名是一个指向数组开头的常量,不能修改 var 的值,如var = var + 1是非法的。

指针数组

数组存储指向 int 等数据类型的指针。

#include <iostream>
 
using namespace std;
const int MAX = 3;
 
int main ()
{
   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;     // 10, 100, 200
   }
   return 0;
}

使用指向字符的指针数组来存储一个字符串列表:

const char *names[MAX] = {
                   "Zara Ali",
                   "Hina Ali",
                   "Nuha Ali",
                   "Sara Ali",
};

printf("names[0]= %s", names[0]);  // Zara Ali
  • names[0] 为指向 char 类型的指针变量,存储的是字符串首元素 Z 的地址。
  • 为什么names[0]打印输出整个字符串呢?C规定打印字符串时用%s控制,对应变量那里只需要字符串的第一个字符的指针即可,直至遇到'\0',所以提供首字母地址即可打印字符串。

指针传递给函数

传递一个 unsigned long 类型的值的地址给 par

#include <iostream>
#include <ctime>
 
using namespace std;
void getSeconds(unsigned long *par);

int main ()
{
   unsigned long sec;
   getSeconds( &sec );

   // 输出实际值
   cout << "Number of seconds :" << sec << endl;
   return 0;
}

void getSeconds(unsigned long *par)
{
   // 获取当前的秒数
   *par = time( NULL );
   return;
}

数组作为参数传递给指针变量:数组名 == 数组首元素起始地址

#include <iostream>
using namespace std;
 
// 函数声明
double getAverage(int *arr, int size);
 
int main () {
   // 带有 5 个元素的整型数组
   int balance[5] = {1000, 2, 3, 17, 50};
   double avg;
 
   // 传递一个指向数组的指针作为参数
   avg = getAverage( balance, 5 ) ;
 
   // 输出返回值
   cout << "Average value is: " << avg << endl;     
   return 0;
}

double getAverage(int *arr, int size) {
  int    i, sum = 0;       
  double avg;          
 
  for (i = 0; i < size; ++i) {
    sum += arr[i];
  }
  
  avg = double(sum) / size;
  return avg;
}

C++ 引用

引用的定义

引用变量是一个别名,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称来指向变量。

引用与指针

  • 引用一旦被初始化为一个对象,就不能指向另一个对象;指针可以在任何时候指向另一个对象
  • 引用创建时必须初始化;指针可以在任何时候初始化
  • 不存在空的引用

引用的使用

创建引用

int a = 17;
// r为a的引用
int& r = a;

// a = r = 17
cout << a << endl;
cout << r << endl;

引用传递给函数

#include <iostream>
using namespace std;
 
// 函数声明
void swap(int& x, int& y);
 
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;
}

参考文章

[1] C++指针

[2] C++引用

posted @ 2022-09-15 19:42  ylyzty  阅读(32)  评论(0编辑  收藏  举报