指针在数组中的应用原理是什么?

2026-05-17 01:581阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1917个文字,预计阅读时间需要8分钟。

指针在数组中的应用原理是什么?

C++ 指针与数组的关系。如何传递数组参数。如何返回数组参数。C/C++ 中指针与数组的联系非常紧密。数组的真正目的是什么?如何将一个数组传递到函数中?为什么可以这样访问数组的值?

C++指针与数组的关系。 如何传递数组参数。 如何返回数组参数。 前言

C, C++的指针和数组的联系非常紧密。数组的真正面目是什么?如何传递一个数组到函数中?为什么可以这么访问数组?函数如何返回多个返回值?这些问题老生常谈。至于答案。。。。

1 数组名与指针

这一切的一切都要从数组名是一个指针开始说起。

数组名是一个指针! 数组名是一个指针! 数组名是一个指针!(但实际上两者还是有不同的。)

我们先来看一个例子。

#include <iostream> using namespace std; int main () { // 带有 5 个元素的双精度浮点型数组 double Array[5] = {1000.0, 2.0, 3.4, 17.0, 50.0}; double *p; p = Array; cout<< "p : addr "<< p << "\t"<< "Array : addr " << Array << endl ; cout<< endl; cout << "使用 p 指针的数组值 " << endl; for ( int i = 0; i < 5; i++ ) { cout << "*(p + " << i << ") : "; cout << *(p + i) << endl; cout << "p[" << i << "] : "; cout << p[i] << endl; } cout<< endl; cout << "使用 Array 作为地址的数组值 " << endl; for ( int i = 0; i < 5; i++ ) { cout << "*(Array + " << i << ") : "; cout << *(Array + i) << endl; cout << "Array[" << i << "] : "; cout << Array[i] << endl; } return 0; }

运行结果:

p : addr 0x6ffde0 Array : addr 0x6ffde0 使用 p 指针的数组值 *(p + 0) : 1000 p[0] : 1000 *(p + 1) : 2 p[1] : 2 *(p + 2) : 3.4 p[2] : 3.4 *(p + 3) : 17 p[3] : 17 *(p + 4) : 50 p[4] : 50 使用 Array 作为地址的数组值 *(Array + 0) : 1000 Array[0] : 1000 *(Array + 1) : 2 Array[1] : 2 *(Array + 2) : 3.4 Array[2] : 3.4 *(Array + 3) : 17 Array[3] : 17 *(Array + 4) : 50 Array[4] : 50

我们发现,数组名就是一个指针(The type of Array is double *)!

将这个 Array 指针(double *)所指向的内存地址赋值给double * p。两者指向的地址是一样的0x6ffde0, 即数组第一个元素所在内存的地址。

由此,p指针获得了一个数组,或者说此时的p就是一个数组名,可以用任何正常访问数组的方式来访问这个p数组。*(p+i) or p[i]

2 数组传参

既然我们知道了数组名就是一个指针,那么传参的时候把指针传过去就行了。

有三种传递的方式,但是实质还是传指针过去。上代码。

#include <iostream> using namespace std; void outArray1(double* arr, int size); void outArray2(double arr[], int size); void outArray3(double arr[5], int size); int main () { // 带有 5 个元素的双精度浮点型数组 double Array[5] = {1000.0, 2.0, 3.4, 17.0, 50.0}; double *p; p = Array; cout<< "p : addr "<< p << "\t"<< "Array : addr " << Array << endl ; cout<< endl; outArray1(Array, 5); outArray2(Array, 5); outArray3(Array, 5); return 0; } void outArray1(double* arr, int size){ cout<<"outArray1(double* arr, int size)"<<endl; for ( int i = 0; i < size; i++ ) { cout << arr[i] << " " ; } cout<< endl; } void outArray2(double arr[], int size){ cout<<"outArray3(double arr[], int size)"<<endl; for ( int i = 0; i < size; i++ ) { cout << arr[i] << " " ; } cout<< endl; } void outArray3(double arr[5], int size){ cout<<"outArray3(double arr[5], int size)"<<endl; for ( int i = 0; i < size; i++ ) { cout << arr[i] << " " ; } cout<< endl; }

运行结果:

p : addr 0x6ffdf0 Array : addr 0x6ffdf0 outArray1(double* arr, int size) 1000 2 3.4 17 50 outArray3(double arr[], int size) 1000 2 3.4 17 50 outArray3(double arr[5], int size) 1000 2 3.4 17 50

综上这三种方法分别为:

  1. (double* arr, int size)

  2. (double arr[], int size)

  3. (double arr[size], int size) // arr[1] or arr[2] 需要将数组实际大小标注出来!

3 返回数组

数组名是指针,我们让函数返回一个指针,同时按数组来访问。这样可以么?思路绝对没错,可是...

我们学习过编译原理的话,就会明白,子函数运行时被加载到程序内存中,子函数运行完毕后会从程序内存中删除。所以内里的一切数据和指令也会被清除,函数中的待返回的数组也会被清除,当你返回指针(存着数组首地址)后,数组被清除了,结果就是访问不到数据了!

有没有可以让函数运行完毕之后,内里的数据还存在的方法呢?这样我们就能将指向这个数据地址的指针返回出来,并且正确访问。

答案是 static 数据。static数据的生存周期是整个 main()函数的生存周期,也就是说,函数没了,数据还在,并不会被销毁!

接下来看示例代码

#include <iostream> using namespace std; double* return5ArrayNotST(); double* return5ArrayST(); int main () { double *p; p = return5ArrayNotST(); cout << "使用 p : addr "<< p <<" 指针接收的 not static array " << endl; cout << "double arr[5] = {6.0, 6.1, 6.2, 6.3, 6.4};" << endl; for ( int i = 0; i < 5; i++ ) { cout << "p[" << i << "] : "; cout << p[i] << endl; } cout<< endl; p = return5ArrayST(); cout << "使用 p : addr "<< p <<" 指针接收的 static array " << endl; cout << "static double arr[5] = {6.0, 6.1, 6.2, 6.3, 6.4};" << endl; for ( int i = 0; i < 5; i++ ) { cout << "p[" << i << "] : "; cout << p[i] << endl; } return 0; } double* return5ArrayNotST(){ double arr[5] = {6.0, 6.1, 6.2, 6.3, 6.4}; cout<<"arr in return5ArrayNotST() : addr " << arr << endl; return arr; } double* return5ArrayST(){ static double arr[5] = {6.0, 6.1, 6.2, 6.3, 6.4}; cout<<"arr in return5ArrayST() : addr " << arr << endl; return arr; }

运行结果:

arr in return5ArrayNotST() : addr 0x6ffda0 使用 p : addr 0x6ffda0 指针接收的 not static array double arr[5] = {6.0, 6.1, 6.2, 6.3, 6.4}; p[0] : 6.12209e-317 p[1] : 4.94066e-324 p[2] : 2.17389e-322 p[3] : 6.12209e-317 p[4] : 3.62622e-317 arr in return5ArrayST() : addr 0x472020 使用 p : addr 0x472020 指针接收的 static array static double arr[5] = {6.0, 6.1, 6.2, 6.3, 6.4}; p[0] : 6 p[1] : 6.1 p[2] : 6.2 p[3] : 6.3 p[4] : 6.4

最后需要注意一点。sizeof()对于数组名以及指针名算出来的是不同的,这个区别要记一下。

指针在数组中的应用原理是什么?

Refferences:
www.runoob.com/cplusplus/cpp-arrays.html
ecomputernotes.com/what-is-c/array/static-arrays

文章会随时改动,要到自由互联里看偶。一些网站会爬取本文章,但是可能会有出入。
转载请注明出处哦( ̄︶ ̄)↗ 
www.cnblogs.com/asmurmur/

标签:关系

本文共计1917个文字,预计阅读时间需要8分钟。

指针在数组中的应用原理是什么?

C++ 指针与数组的关系。如何传递数组参数。如何返回数组参数。C/C++ 中指针与数组的联系非常紧密。数组的真正目的是什么?如何将一个数组传递到函数中?为什么可以这样访问数组的值?

C++指针与数组的关系。 如何传递数组参数。 如何返回数组参数。 前言

C, C++的指针和数组的联系非常紧密。数组的真正面目是什么?如何传递一个数组到函数中?为什么可以这么访问数组?函数如何返回多个返回值?这些问题老生常谈。至于答案。。。。

1 数组名与指针

这一切的一切都要从数组名是一个指针开始说起。

数组名是一个指针! 数组名是一个指针! 数组名是一个指针!(但实际上两者还是有不同的。)

我们先来看一个例子。

#include <iostream> using namespace std; int main () { // 带有 5 个元素的双精度浮点型数组 double Array[5] = {1000.0, 2.0, 3.4, 17.0, 50.0}; double *p; p = Array; cout<< "p : addr "<< p << "\t"<< "Array : addr " << Array << endl ; cout<< endl; cout << "使用 p 指针的数组值 " << endl; for ( int i = 0; i < 5; i++ ) { cout << "*(p + " << i << ") : "; cout << *(p + i) << endl; cout << "p[" << i << "] : "; cout << p[i] << endl; } cout<< endl; cout << "使用 Array 作为地址的数组值 " << endl; for ( int i = 0; i < 5; i++ ) { cout << "*(Array + " << i << ") : "; cout << *(Array + i) << endl; cout << "Array[" << i << "] : "; cout << Array[i] << endl; } return 0; }

运行结果:

p : addr 0x6ffde0 Array : addr 0x6ffde0 使用 p 指针的数组值 *(p + 0) : 1000 p[0] : 1000 *(p + 1) : 2 p[1] : 2 *(p + 2) : 3.4 p[2] : 3.4 *(p + 3) : 17 p[3] : 17 *(p + 4) : 50 p[4] : 50 使用 Array 作为地址的数组值 *(Array + 0) : 1000 Array[0] : 1000 *(Array + 1) : 2 Array[1] : 2 *(Array + 2) : 3.4 Array[2] : 3.4 *(Array + 3) : 17 Array[3] : 17 *(Array + 4) : 50 Array[4] : 50

我们发现,数组名就是一个指针(The type of Array is double *)!

将这个 Array 指针(double *)所指向的内存地址赋值给double * p。两者指向的地址是一样的0x6ffde0, 即数组第一个元素所在内存的地址。

由此,p指针获得了一个数组,或者说此时的p就是一个数组名,可以用任何正常访问数组的方式来访问这个p数组。*(p+i) or p[i]

2 数组传参

既然我们知道了数组名就是一个指针,那么传参的时候把指针传过去就行了。

有三种传递的方式,但是实质还是传指针过去。上代码。

#include <iostream> using namespace std; void outArray1(double* arr, int size); void outArray2(double arr[], int size); void outArray3(double arr[5], int size); int main () { // 带有 5 个元素的双精度浮点型数组 double Array[5] = {1000.0, 2.0, 3.4, 17.0, 50.0}; double *p; p = Array; cout<< "p : addr "<< p << "\t"<< "Array : addr " << Array << endl ; cout<< endl; outArray1(Array, 5); outArray2(Array, 5); outArray3(Array, 5); return 0; } void outArray1(double* arr, int size){ cout<<"outArray1(double* arr, int size)"<<endl; for ( int i = 0; i < size; i++ ) { cout << arr[i] << " " ; } cout<< endl; } void outArray2(double arr[], int size){ cout<<"outArray3(double arr[], int size)"<<endl; for ( int i = 0; i < size; i++ ) { cout << arr[i] << " " ; } cout<< endl; } void outArray3(double arr[5], int size){ cout<<"outArray3(double arr[5], int size)"<<endl; for ( int i = 0; i < size; i++ ) { cout << arr[i] << " " ; } cout<< endl; }

运行结果:

p : addr 0x6ffdf0 Array : addr 0x6ffdf0 outArray1(double* arr, int size) 1000 2 3.4 17 50 outArray3(double arr[], int size) 1000 2 3.4 17 50 outArray3(double arr[5], int size) 1000 2 3.4 17 50

综上这三种方法分别为:

  1. (double* arr, int size)

  2. (double arr[], int size)

  3. (double arr[size], int size) // arr[1] or arr[2] 需要将数组实际大小标注出来!

3 返回数组

数组名是指针,我们让函数返回一个指针,同时按数组来访问。这样可以么?思路绝对没错,可是...

我们学习过编译原理的话,就会明白,子函数运行时被加载到程序内存中,子函数运行完毕后会从程序内存中删除。所以内里的一切数据和指令也会被清除,函数中的待返回的数组也会被清除,当你返回指针(存着数组首地址)后,数组被清除了,结果就是访问不到数据了!

有没有可以让函数运行完毕之后,内里的数据还存在的方法呢?这样我们就能将指向这个数据地址的指针返回出来,并且正确访问。

答案是 static 数据。static数据的生存周期是整个 main()函数的生存周期,也就是说,函数没了,数据还在,并不会被销毁!

接下来看示例代码

#include <iostream> using namespace std; double* return5ArrayNotST(); double* return5ArrayST(); int main () { double *p; p = return5ArrayNotST(); cout << "使用 p : addr "<< p <<" 指针接收的 not static array " << endl; cout << "double arr[5] = {6.0, 6.1, 6.2, 6.3, 6.4};" << endl; for ( int i = 0; i < 5; i++ ) { cout << "p[" << i << "] : "; cout << p[i] << endl; } cout<< endl; p = return5ArrayST(); cout << "使用 p : addr "<< p <<" 指针接收的 static array " << endl; cout << "static double arr[5] = {6.0, 6.1, 6.2, 6.3, 6.4};" << endl; for ( int i = 0; i < 5; i++ ) { cout << "p[" << i << "] : "; cout << p[i] << endl; } return 0; } double* return5ArrayNotST(){ double arr[5] = {6.0, 6.1, 6.2, 6.3, 6.4}; cout<<"arr in return5ArrayNotST() : addr " << arr << endl; return arr; } double* return5ArrayST(){ static double arr[5] = {6.0, 6.1, 6.2, 6.3, 6.4}; cout<<"arr in return5ArrayST() : addr " << arr << endl; return arr; }

运行结果:

arr in return5ArrayNotST() : addr 0x6ffda0 使用 p : addr 0x6ffda0 指针接收的 not static array double arr[5] = {6.0, 6.1, 6.2, 6.3, 6.4}; p[0] : 6.12209e-317 p[1] : 4.94066e-324 p[2] : 2.17389e-322 p[3] : 6.12209e-317 p[4] : 3.62622e-317 arr in return5ArrayST() : addr 0x472020 使用 p : addr 0x472020 指针接收的 static array static double arr[5] = {6.0, 6.1, 6.2, 6.3, 6.4}; p[0] : 6 p[1] : 6.1 p[2] : 6.2 p[3] : 6.3 p[4] : 6.4

最后需要注意一点。sizeof()对于数组名以及指针名算出来的是不同的,这个区别要记一下。

指针在数组中的应用原理是什么?

Refferences:
www.runoob.com/cplusplus/cpp-arrays.html
ecomputernotes.com/what-is-c/array/static-arrays

文章会随时改动,要到自由互联里看偶。一些网站会爬取本文章,但是可能会有出入。
转载请注明出处哦( ̄︶ ̄)↗ 
www.cnblogs.com/asmurmur/

标签:关系