指针、动态数组、二维数组、数组形参学习小记

本文详细介绍了 C++ 中指针与数组的概念及其应用,包括指针数组、数组指针、指针所存地址的显示方法、动态数组的创建与使用等。并通过多个实例演示了如何在实际编程中运用这些概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近学习了C++中的指针与数组部分,把一些学习笔记及心得分享一下供大家参考,小白之作,请大家多多提建议吐舌头

应用的编辑器为VS2010

一、指针

1、指针数组与数组指针

声明方式:

  int *a[10];       // 指针数组  数组中的元素均为指针变量
  int (*a)[10];    // 数组指针  指向长度为10的一维数组的指针

2、指针所存地址的显示

可以以十六进制的形式来显示地址 ,输出时利用格式控制符 %08X ,它表示的输出形式为 大写的16进制 右对齐 不足8位补零 (参考例程1.1)

3、指向指针的指针

   int * *pa ;    //  这里的pa就是指向指针数据的指针变量 ,它可以指向指针变量,也就是存放指针变量的地址

例程1.1

#include "iostream"

#include"dos.h"
#include <afxwin.h>

using namespace std;

void main()
{
    int*(*p),*q,v;
    v=2;
    q=&v;  
    p=&q;  //指向指针的指针p 中存放的是 指针q 的地址
    CString str;
    str.Format(" p中存放的指针q的地址为 %08X q中存放的变量v的地址为 %08X ", p ,q);
    cout<<str<<endl;
    system("pause");

}

若出现

 fatal error C1189: #error :  Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version.
 Please #define _AFXDLL or do not use /MD[d] 编译错误
    可以通过点击菜单项 属性-》配置属性-》MFC的使用-》在共享 DLL 中使用 MFC

此外

   点击菜单项 属性-》配置属性-》字符集-》使用多字节字符集

二、二维数组与一维数组之间的调用转换
前提:二维数组的内存分配是连续的
例程2.1

#include "iostream"

#include"dos.h"
#include <afxwin.h>

using namespace std;


 void main()
{
  int ArrayTwo[3][4];
  int ArrayOne[12];
  for (int i=0;i<3;i++)
 {
    for (int j=0;j<4;j++)
   {   
       static int c=0;
       c++;
       ArrayTwo[i][j]=c;
       
   }

 }
  int* p1 = & ArrayTwo[0][0]; //获取二维数组的首地址
  for (int i=0;i<12;i++)
  ArrayOne[i]=p1[i];
  cout<<ArrayTwo[2][3]<<endl<<ArrayOne[11]<<endl;
  system("pause");

}

三、把一维数组或二维数组传递给函数

2.1二维数组用数组形参调用一维数组
void fun1(const int a[],int arraysize); //函数的声明
int pt[10];                        //数组的声明及初始化
for(int i=0;i<10;i++)
   pt[i]=i+1;

fun1(pt,arraysize);                 //函数的调用
void fun1(const int a[],int arraysize) //函数的定义
 {
    // a[0]++;   //定义了const不能修改原函数的值
 }

2.2二维数组用数组形参调用二维数组
void fun1(const int a[][5],int num1); //函数的声明
int a[4][5];                        //数组的声明及初始化
 for (int i=0;i<4;i++)
 {
    for (int j=0;j<5;j++)
   {  static int c=0;
       c++;
       a[i][j]=c;
   }
    
 }
int arraysize=4;
fun1(a,arraysize);                 //函数的调用
void fun1(const int a[][5],int num1) //函数的定义
 {
    // a[0]++;   //定义了const不能修改原函数的值
 }

四、动态数组的应用
3.1 一维动态数组    
实质:创建一个数组指针 指向一个长度为arraysize的数组

   声明长度变量
   定义指针类型 声明指针变量
   调用new操作符创建一个动态数组
   和普通数组一样使用
   调用delete[] 销毁

int arraysize; //声明长度变量
int *pt = new int[ arraysize];               //也可以分成三部来做 typedef int* IntArrayPtr;IntArrayPtr pt; pt = new int[ arraysize];
delete[] pt;

3.2 二维动态数组
实质:创建一个指向指针的指针  指向一个长度为a的指针数组  指针数组的每一个指针都指向一个长度为b的数组
//创建一个指向指针的指针   指向一个长度为a,装着指向长度为b的数组的数组指针的指针数组。

static int d1,d2;                  //声明二维数组长度变量
int *(*pt) = new int *[d1];  //定义指针类型 声明指针变量  调用new操作符创建动态二维数组
for(int i=0;i<d1;i++)
   pt[i]= new int[d2];

for(int i=0;i<d1;i++)        //调用delete[] 销毁二维数组
  delete [] pt[i];
  delete [] pt ;
  

例程3.1

// 一维动态数组的创建及使用
// 通过数组形参来传递数组的函数
// 用 const 定义数组形参后,函数不能改变原函数

 void fun1(const int a[],int num1);
 void fun2( int a[],int num1);

void main()
{
    static int arraysize=10;
 while(1)
 {
    int *pt = new int[ arraysize];
    for(int i=0;i<arraysize;i++)
        pt[i]=i+1;
    fun1(pt,arraysize);
    fun2(pt,arraysize);
    system("pause");
    arraysize++;
    delete[] pt;
 }
}

void fun1(const int a[],int arraysize)
{
    for(int i=0;i<arraysize;i++)
        cout<<"动态数组里面储存的数值分别为:"<<"a["<<i<<"]="<<a[i]<<endl;
     // a[0]++;   //定义了const不能修改原函数的值
}
void fun2( int a[],int arraysize)
{
    cout<<"不使用const没有出错"<<endl;
    for(int i=0;i<arraysize;i++)
        cout<<"动态数组里面储存的数值分别为:"<<"a["<<i<<"]="<<a[i]<<endl;
    a[0]++;
    cout<<"修改后的a[0]="<<a[0]<<endl;
}

例程3.2

void main()
{
 static int d1,d2;
 cout<<"输入二维数组的行和列"<<endl;
 cin>>d1>>d2;
 int *(*pt) = new int *[d1];
 for(int i=0;i<d1;i++)
   pt[i]= new int[d2];
 for (int i=0;i<d1;i++)
 {
    for (int j=0;j<d2;j++)
   {  static int c=0;
       c++;
       pt[i][j]=c;
       cout<< pt[i][j];
   }
       cout<<endl;
 }
for(int i=0;i<d1;i++)
  delete [] pt[i];
  delete [] pt;
  system("pause");
   
}

四、指针和数组

数组变量其实是指针变量 但有个重要区别,不可更改数组变量中的指针值
可将指针标示符pt视为数组标示符,只要指针变量指向内存中的数组,以前适用于数组的方括号记号法同样应用于指针变量
例程4.1

void main()
{
  int* pt,a,b;  
  int arraypt[5];
  for(int i=0;i<5;i++)
    {
        static int c=1; // 容易出问题
        c++;
        arraypt[i]=c;
    }
  a=2;
  b=3;
  pt=&a;
  pt=&b; //可以改变指针变量的指针值
  //cout<<*pt<<endl;
 // *arraypt=b;//可以将数组标示符arraypt视为指针变量,但有个重要区别,不可更改数组变量中的指针值
  //arraypt=&b;
  pt=arraypt;
  for(int i=0;i<5;i++)
     cout<<arraypt[i]<<" "<<pt[i]<<endl;
  system("pause");
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值