#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的值(地址)不变,那么相应位置的数值改变了,该数组的地址也不会受到影响。
之前一直不知道 NULL 到底是怎么一回事,但是其实我们用 vs2013 可以看到,NULL 的定义就是:
define NULL 0
我们可以用这个程序直观地看到,NULL 的本质。
#include<bits/stdc++.h> using namespace std; int main() { cout<<"NULL="<<NULL<<endl; return 0; }
程序运行结果为:
NULL=0
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; }
根据教程及楼上我又修改了一下代码,看看三种方法中形参 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 字节内存,虽然表面形式不一样。具体原因我也不清楚,希望有高手具体解答。
函数形参传递的其实是一个指针
如果您想要在函数中传递一个一维数组作为参数,您必须以下面三种方式来声明函数形式参数,这三种声明方式的结果是一样的,因为每种方式都会告诉编译器将要接收一个整型指针。同样地,您也可以传递一个多维数组作为形式参数。
#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 个字节。
感谢您的支持,我会继续努力的!
支付宝扫一扫,即可进行扫码打赏哦
1974cpp-pointers-vs-arrays
输出结果:
根据实验结果,此章节最后一句应该不是说数组内的数值不能修改,而是说只要var的值(地址)不变,那么相应位置的数值改变了,该数组的地址也不会受到影响。
1973cpp-null-pointers
之前一直不知道 NULL 到底是怎么一回事,但是其实我们用 vs2013 可以看到,NULL 的定义就是:
我们可以用这个程序直观地看到,NULL 的本质。
程序运行结果为:
1972cpp-return-arrays-from-function
C++中函数是不能直接返回一个数组的,但是数组其实就是指针,所以可以让函数返回指针来实现:
1971cpp-passing-arrays-to-functions
根据教程及楼上我又修改了一下代码,看看三种方法中形参 arr 所占内存大小。
运行结果为:
结论:
三种方法都是通过指针完成数组传递,arr 都占用 8 字节内存,虽然表面形式不一样。具体原因我也不清楚,希望有高手具体解答。
1970cpp-passing-arrays-to-functions
函数形参传递的其实是一个指针
如果您想要在函数中传递一个一维数组作为参数,您必须以下面三种方式来声明函数形式参数,这三种声明方式的结果是一样的,因为每种方式都会告诉编译器将要接收一个整型指针。同样地,您也可以传递一个多维数组作为形式参数。
稍微修改了课文中的例子,做一个实验,运行结果如下:
可见,数组的元素个数有 5 个。但是函数中传递的其实是一个指向整型的指针,而整型指针占用 8 个字节。