20.【C/C++ 指针数组和数组指针 (超详版)】(一)

简介: 20.【C/C++ 指针数组和数组指针 (超详版)】

(一)、指针数组

1. 什么是指针数组:

在C语言和C++等语言中,数组元素全为指针变量的数组称为指针数组,指针数组中的元素都必须具有相同的存储类型、指向相同数据类型的指针变量。指针数组是数组元素为指针的数组(例如 int *p[3],定义了p[0],p[1],p[2]三个指针),其本质为数组。

2.指针数组的格式:

数据类型 *首地址[];

3.指针数组的作用:

指针数组比较适合用来指向若干个字符串,使字符串处理更加方便、灵活。

4.指针数组与一维数组的关系:

指针数组每个元素都是指针,一维数组的地址可以赋值给指针。然后进行操作.

#include<iostream>
using namespace std;
int main()
{
  int* p[3];    //定义一个指针数组
  int a[] = { 3,6,1,9,10 };   //定义一个整型数组
  p[0] = a;        //p[0]是一个类型为int* 指向int的指针,a是一个int*,指向int 
  p[1] = a + 1;
  p[2] = a + 3;
  cout << (*p[0]) << "  " << (*p[1]) << "  " << (*p[2]) << endl;   //[]优先级比()高,所以()没起到作用
  cout << a[0] << "  " << a[1] << "  " << a[3] << endl;
  int* q;       //普通指针
  q = a + 1;
  cout << *q;
}

补充:::::::::::::::::::

如果是 二维数组a[0]+1;代表a[0][1]; 这时候a[0]是行数组名它代表这一行的首地址就是a[0][0],+1就等于加它类型的字节数1x字节数,(+2就是2x字数)结果就是a[0][1];如果是一维的话,更简单;+1就等于加它类型的字节数x1;结果是a[1];

5.指针数组与二维数组的关系

#include<iostream>
using namespace std;
int main()
{
  int* p[3];    //定义一个指针数组
  int a[2][3] = {{3,6,1} ,{12,9,10}};   //定义一个二维整型数组
  p[0] = a[0];    //a[0]=&a[0][0]
  p[1] = a[1];   // a[1]=&a[1][0]
  cout << a[0][1] << endl;       //输出a[0][1]
  cout << *(a[0] + 1) << endl;    //输出a[0][1],(a[0]+1)这样代表地址
  cout << *(p[0] + 1) << endl;  //输出a[0][1],指针+1代表移动一个数(列)
  cout << *(p[0] + 2) << endl;  //输出a[0][2],指针+1代表移动一个数(列)
  return 0;
}

接下来让我们练习一道题:(二维数组全部元素求和)

#include<iostream>
using namespace std;
int main()
{
  int sum=0;
  int* p[3];    //定义一个指针数组
  int a[2][3] = {{3,6,1} ,{12,9,10}};   //定义一个二维整型数组
  p[0] = a[0];    //a[0]=&a[0][0]
  p[1] = a[1];   // a[1]=&a[1][0]
  for (int i = 0; i < 2; i++)
  {
    for (int j = 0; j < 3; j++)
    {
      sum += *(p[i] + j);//或者 *(*(p+i)+j) 或者 p[i][j]
    }
  }
  cout << "求和后得:" << sum << endl;
  return 0;
}

6.指针数组申请动态二维数组

指针数组申请动态二维数组格式:
【方法1基本格式】
int **p;    //指针类型是int** 型,指向int*型的指针变量
p=new int*[列]
for(int i=0;i<列;i++)
{
    p[i]=new int [列]
}

6.实战项目:

代码展示:

1.错误示范:

【指针指向二维数组不能用*p=a[0]】
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
 int a[2][2] = {1,2,3,4};
 int* p;
 *p = a[0];
 for (int i = 0; i < 4; i++)
 {
  cout << setw(2) << *(p+i) ;
 }
 return 0;
}

2.指针数组申请动态二维数组

#include <iostream>
using namespace std;
int main()
{
    int m, n;
    cout << "请输入行数为:" << endl;
    cin >> m;
    cout << "请输入列数:" << endl;
    cin >> n;
    int**p;                 // 
    p = new int*[n];
    for (int i = 0; i < n; i++)
    {
        p[i] = new int[n];    //左边行,右边列
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cin >> p[i][j];
        }
    }
    cout << "输出为:" << endl;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cout<< p[i][j]<<" ";
        }
    }
    delete[]p;
    return 0;
}
效果展示:

1.错误示范效果展示:

2.申请动态二维数组正确效果

7.小结

7.1指针数组名加1,移动多少字节?

*(p+1):走了一行; * (p+1)+1走了一列

7.2指针数组名相当于什么样的指针?

指针数组名就是元素地址相当于一级指针取地址就是二级指针,故指针数组名相当于二级指针“数据类型 * p” 本身就是一个指针,而它的数据类型是int * 也是一个指针,故称为二级指针。

(二)、数组指针:

1.什么是数组指针

数组指针,指的是数组名的指针,即数组首元素地址的指针。即是指向数组的指针。例:int (*p)[10]; p即为指向数组的指针,又称数组指针。

2.数组指针的格式:

数据类型(*p)[];

3.数组指针的作用:

数组指针是指向数组地址的指针,其本质为指针;


相关文章
|
6天前
|
C++
【C++】智能指针
【C++】智能指针
|
4天前
|
编译器 C++
virtual类的使用方法问题之在C++中获取对象的vptr(虚拟表指针)如何解决
virtual类的使用方法问题之在C++中获取对象的vptr(虚拟表指针)如何解决
|
3天前
|
算法 Java
双指针在数组遍历中的应用
文章深入探讨了双指针技术在数组遍历中的应用,通过实战例子详细解释了快慢指针和首尾指针的不同用法,并提供了解决LeetCode相关问题的Java代码实现。
|
10天前
|
存储 安全 编译器
C++入门 | auto关键字、范围for、指针空值nullptr
C++入门 | auto关键字、范围for、指针空值nullptr
31 4
|
19天前
|
存储 安全 C++
浅析C++的指针与引用
虽然指针和引用在C++中都用于间接数据访问,但它们各自拥有独特的特性和应用场景。选择使用指针还是引用,主要取决于程序的具体需求,如是否需要动态内存管理,是否希望变量可以重新指向其他对象等。理解这二者的区别,将有助于开发高效、安全的C++程序。
14 2
|
4天前
|
安全 编译器 容器
C++STL容器和智能指针
C++STL容器和智能指针
|
4天前
|
安全 编译器 C语言
|
6天前
|
C++
C++通过文件指针获取文件大小
C++通过文件指针获取文件大小
|
6天前
|
编译器 C语言 C++
【C++关键字】指针空值nullptr(C++11)
【C++关键字】指针空值nullptr(C++11)
|
6天前
|
算法 C++ 容器
【C++算法】双指针
【C++算法】双指针