最近学习了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");
}