C++ 教程 在线

1974cpp-pointers-vs-arrays

#include <iostream>
 
using namespace std;
const int MAX = 3;
 
int main ()
{
   int  var[MAX] = {10, 100, 200};
   cout<<var<<endl;
   cout<<*var<<endl;
   for (int i = 0; i < MAX; i++)
   {
      *var = i;    // 这是正确的语法
       cout<<*var<<endl;
       cout<<i<<endl;
       cout<<&i<<endl;
       cout<<var<<endl;
       *(var+1)=500;
       cout<<*(var+1)<<endl;
      //var++;       // 这是不正确的
   }
   return 0;
}

输出结果:

0x7ffda7291170
10
0
0
0x7ffda729116c
0x7ffda7291170
500
1
1
0x7ffda729116c
0x7ffda7291170
500
2
2
0x7ffda729116c
0x7ffda7291170
500

根据实验结果,此章节最后一句应该不是说数组内的数值不能修改,而是说只要var的值(地址)不变,那么相应位置的数值改变了,该数组的地址也不会受到影响。

1973cpp-null-pointers

之前一直不知道 NULL 到底是怎么一回事,但是其实我们用 vs2013 可以看到,NULL 的定义就是:

define NULL 0

我们可以用这个程序直观地看到,NULL 的本质。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    cout<<"NULL="<<NULL<<endl;
    return 0;
}

程序运行结果为:

NULL=0

1972cpp-return-arrays-from-function

C++中函数是不能直接返回一个数组的,但是数组其实就是指针,所以可以让函数返回指针来实现:

 #include <iostream>
 
 using namespace std;
 
 void MultMatrix(float M[4], float A[4], float B[4])
 {
     M[0] = A[0]*B[0] + A[1]*B[2];
     M[1] = A[0]*B[1] + A[1]*B[3];
     M[2] = A[2]*B[0] + A[3]*B[2];
     M[3] = A[2]*B[1] + A[3]*B[3];
 
     cout << M[0] << " " << M[1] << endl;
     cout << M[2] << " " << M[3] << endl;
 }
 
 int main()
 {
     float A[4] = { 1.75, 0.66, 0, 1.75 };
     float B[4] = {1, 1, 0, 0};
 
     float *M = new float[4];
     MultMatrix(M, A, B);
 
     cout << M[0] << " " << M[1] << endl;
     cout << M[2] << " " << M[3] << endl;
     delete[] M;
 
     return 0;
 }

1971cpp-passing-arrays-to-functions

根据教程及楼上我又修改了一下代码,看看三种方法中形参 arr 所占内存大小。

#include <iostream>
using namespace std;
double getAverage(int *arr, int size); //形式参数是一个指针:
double getAverage(int arr[5]); // 重载函数,形式参数是一个已定义大小的数组:
double getAverage2(int arr[]); // 不可重载,形式参数是一个未定义大小的数组:
int main(int argc, char const *argv[])
{
    // 带有 5 个元素的整型数组
    int balance[5] = {1000, 2, 3, 17, 50};
    int *pt1 = balance;
    // 分别计算数组元素个数,以及整型指针的字节数
    size_t balance_size = sizeof(balance) / sizeof(int);
    size_t pt1_size = sizeof(pt1);
    double avg, avg2, avg3;
    cout << "array size : " << balance_size << endl;
    cout << "pt1_size : " << pt1_size << endl;
    avg = getAverage(balance, 5);
    avg2 = getAverage(balance);
    avg3 = getAverage2(balance);
    // 输出返回值
    cout << "方法1平均值是:" << avg << endl;
    cout << "方法2平均值是:" << avg << endl;
    cout << "方法3平均值是:" << avg << endl;
    return 0;
}
double getAverage(int *arr, int size)
{
    int i, sum = 0;
    double avg;
    // 打印第一个形参的字节数
    cout << "Inside getAverage sizeof(arr) = " << sizeof(arr) << endl;
    for (int i = 0; i < size; ++i)
    {
        sum += arr[i];
    }
    avg = double(sum) / size;
    return avg;
}
double getAverage(int arr[5])
{
    int i, sum = 0, size = 5;
    double avg;
    // 打印第一个形参的字节数
    cout << "Inside getAverage sizeof(arr) = " << sizeof(arr) << endl;
    for (int i = 0; i < size; ++i)
    {
        sum += arr[i];
    }
    avg = double(sum) / size;
    return avg;
}
double getAverage2(int arr[])
{
    int i, sum = 0, size = 5;
    double avg;
    // 打印第一个形参的字节数
    cout << "Inside getAverage sizeof(arr) = " << sizeof(arr) << endl;
    for (int i = 0; i < size; ++i)
    {
        sum += arr[i];
    }
    avg = double(sum) / size;
    return avg;
}

运行结果为:

array size : 5
pt1_size : 8
Inside getAverage sizeof(arr) = 8
Inside getAverage sizeof(arr) = 8
Inside getAverage sizeof(arr) = 8
方法1平均值是:214.4
方法2平均值是:214.4
方法3平均值是:214.4

结论:

三种方法都是通过指针完成数组传递,arr 都占用 8 字节内存,虽然表面形式不一样。具体原因我也不清楚,希望有高手具体解答。

1970cpp-passing-arrays-to-functions

函数形参传递的其实是一个指针

如果您想要在函数中传递一个一维数组作为参数,您必须以下面三种方式来声明函数形式参数,这三种声明方式的结果是一样的,因为每种方式都会告诉编译器将要接收一个整型指针。同样地,您也可以传递一个多维数组作为形式参数。

稍微修改了课文中的例子,做一个实验,
#include <iostream>
using namespace std;
double getAverage(int *arr, int size);
int main(int argc, char const *argv[])
{
    // 带有 5 个元素的整型数组
    int balance[5] = {1000, 2, 3, 17, 50};
    int *pt1 = balance;
    // 分别计算数组元素个数,以及整型指针的字节数
    size_t balance_size = sizeof(balance) / sizeof(int);
    size_t pt1_size = sizeof(pt1);
    double avg;
    cout << "array size : " << balance_size << endl;
    cout << "pt1_size : " << pt1_size << endl;
    avg = getAverage(balance, 5);
    // 输出返回值
    cout << "平均值是:" << avg << endl;
    return 0;
}
double getAverage(int *arr, int size)
{
    int i, sum = 0;
    double avg;
    // 打印第一个形参的字节数
    cout << "Inside getAverage sizeof(arr) = " << sizeof(arr) << endl;
    for (int i = 0; i < size; ++i)
    {
        sum += arr[i];
    }
    avg = double(sum) / size;
    return avg;
}

运行结果如下:

array size : 5
pt1_size : 8
Inside getAverage sizeof(arr) = 8
平均值是:214.4

可见,数组的元素个数有 5 个。但是函数中传递的其实是一个指向整型的指针,而整型指针占用 8 个字节。