C++ 教程 在线

1984cpp-passing-pointers-to-functions

传递指针给函数的过程补充

#include <iostream>
#include <ctime>
void getSeconds(unsigned long *par);
int main()
{
    unsigned long sec = 0;
    cout << "Value of sec = :" << sec << endl;
    cout << "Value of &sec = :" << &sec << endl;
    cout << endl;
    getSeconds(&sec);
    // 输出实际值
    cout << "Number of seconds :" << sec << endl;
    return 0;
}
void getSeconds(unsigned long *par)
{
    cout << "Value of *par = :" << *par << endl;
    cout << "Value of par = :" << par << endl;
    cout << "Value of &par = :" << &par << endl;
    cout << endl;
    // 获取当前的秒数
    *par = time(NULL);
    cout << "Value of *par = :" << *par << endl;
    cout << endl;
    return;
}

1983cpp-passing-pointers-to-functions

这是一个求平均数的程序。

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

1982cpp-pointer-to-pointer

通过查看 var,ptr,*pptr 的地址可以更加清晰的理解多级间接寻址的寻址过程,从结果可以看出这 3 个的地址都是一样的。

#include <iostream>
 
using namespace std;
int main ()
{
    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;
    cout << "var 地址为 :" << &var << endl;
    cout << "ptr=&var 值为var的地址:" << ptr << endl;
    cout << "ptr地址为:" << &ptr << endl;
    cout << "*pptr=ptr=&var  值为var的地址:" << *pptr << endl;
    cout << "pptr 地址为:" << &pptr << endl;
    return 0;
}

运算结果为:

var 值为 :3000
*ptr 值为:3000
**pptr 值为:3000
var 地址为 :0x7ffeec7a65e8
ptr=&var 值为var的地址:0x7ffeec7a65e8
ptr地址为:0x7ffeec7a65e0
*pptr=ptr=&var  值为var的地址:0x7ffeec7a65e8
pptr 地址为:0x7ffeec7a65d8

1981cpp-array-of-pointers

char *names[MAX] 这种字符型的指针数组是存储指针的数组,但是在理解字符型指针数组的时候,可以将它理解为一个二维数组,如 const char *names[4] = {"Zara Ali","Hina Ali","Nuha Ali","Sara Ali",} 可以理解为一个 4 行 8 列的数组,可以用 cout << *(names[i] + j)<< endl 取出数组中的每个元素。

#include <iostream>
using namespace std;
const int MAX = 4;
int main ()
{
    const char *names[MAX] = {
        "Zara Ali",
        "Hina Ali",
        "Nuha Ali",
        "Sara Ali",
    };
    for (int i = 0; i < MAX; i++)
        for (int j = 0; j < 8; j++)
        {
            cout << "Value of names[" << i << "] = ";
            cout << *(names[i] + j)<< endl;
        }
    return 0;
}

输出结果为:

Value of names[0] = Z
Value of names[0] = a
Value of names[0] = r
Value of names[0] = a
Value of names[0] =  
Value of names[0] = A
Value of names[0] = l
Value of names[0] = i
Value of names[1] = H
Value of names[1] = i
Value of names[1] = n
Value of names[1] = a
Value of names[1] =  
Value of names[1] = A
Value of names[1] = l
Value of names[1] = i
Value of names[2] = N
Value of names[2] = u
Value of names[2] = h
Value of names[2] = a
Value of names[2] =  
Value of names[2] = A
Value of names[2] = l
Value of names[2] = i
Value of names[3] = S
Value of names[3] = a
Value of names[3] = r
Value of names[3] = a
Value of names[3] =  
Value of names[3] = A
Value of names[3] = l
Value of names[3] = i

1980cpp-array-of-pointers

C 语言的老司机这里要告诉你的是 C++ 的运算符优先级顺序和C的不一样,有细微差别。

int *ptr[3]; 

由于 C++ 运算符的优先级中,* 小于 [],所以 ptr 先和 [] 结合成为数组,然后再和 int * 结合形成数组的元素类型是 int * 类型,得到一个叫一个数组的元素是指针,简称指针数组。

int *(ptr[3]);

这个和上面的一样,优先级顺序是 * 小于 (),() 等于 []ptr 先和 [] 结合成为数组,然后再和 int * 结合形成数组的元素类型是 int * 类型,得到一个叫一个数组的元素是指针。

int (*ptr)[3];

这个就不一样了,优先级顺序是 * 小于 ()() 等于 []()[] 的优先级一样,但是结合顺序是从左到右,所以先是 () 里的 *ptr 结合成为一个指针,然后是 (*ptr)[] 相结合成为一个数组,最后叫一个指针 ptr 指向一个数组,简称数组指针。