// myc++.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"//引用外部文件
#include <stdio.h>
#include <iostream>
using namespace std;
int _tmain(intargc,_TCHAR* argv[])
{
/*
int C;
const int a = 10;
int B[2] = { 1, 2 };
cin >> C;
cout << C;
printf("是是是\n",a);
cout <<"A等于"<<a<<"数组"<<B[1];
*/
//-------------------------------------------------------------------------
//int B[5] = {1,8,9,6,3};
//int *P = B;//指针指向数组首地址,那么可以用指针的偏移运算来指向数组的各个地址
//for (int i = 0; i < 5; i++)
//{
// cout << *B<<"\n";//B表示数组的首地址,*B表示第一个元素
// cout << "下面是通过一个数组首地址偏移指向数组的值\n";
// cout << *(B+i);//可以通过数组首地址进行偏移
// cout << "下面是通过指针变量偏移指向数组的值\n";
// cout << *(P++);//指针变量的偏移运算(通常用于数组因为数组的 元素地址是连续的)P+1表示 偏向内存地址单元的下一个单元
// cout << "下面是通过指针变量下标指向数组的值";
// cout << P[i]<< "\n";//指针变量P原本是指针变量,现在用下标号表示数组的某个值
// cout << B[i];
//}
//------------------------------------------------------------------------------指针数组【栈级别】
int A[3][3] = { { 1, 2, 3 }, { 11, 56, 465 }, { 8, 65, 48 } };//定义一个数组
int*P[] = { A[0], A[1], A[2] };//声明指针数组,把数组中的【每行】元素首地址赋值给指针数组
int i = 0;
for (i; i < 3; i++)
{
/* P[i] = A[i];*/
// cout << *A[i]<<"\n";
cout << "\n";
for (int j = 0; j < 3;j++)
{
cout << *(P[i]++)<<"\a ";
cout << P[i][j]<<" ";
cout << *(A[i]+j)<<"\n";//A[i]表示每一列的一位数组的首地址
}
}
cout << "\n上面是对【指针数组】【栈级别】的测试效果\n\r";
//int B[][3] = { {4,5,6}, {8,7,9} };
//---------------------------------------------------------------指针数组的堆空间申请、赋值和删除,堆空间需要手动申请和删除【指针数组-堆】
int *p2[2] = { NULL, NULL };
for (int i = 0; i < 2; i++)
{
p2 [i]= newint[2];//堆级别的指针数组
}
//数组指针的堆空间赋值
*p2[0] = 100;
*p2[1] = 200;
//输出
for (int i = 0; i < 2; i++)
{
printf("%d, ",*p2[i]);
}
//清除
for (int i = 0; i < 2; i++)
{
delete[]p2[i];
p2[i] = NULL;
}
cout << "\n上面是对【指针数组】【堆级别】的测试效果\n\r";
//----------------------------------------------------------------------------测试指一个指向数组的指针也就是[数组指针]【栈级别】
int C[2][3] = { { 1, 2, 3 },
{ 4, 5, 6 } };//三列的数组,为数组开辟好了栈空间~!
int(*p3)[3];
p3 =C;//C数组的第一个元素的地址.&C表示数组的首地址
for (int i = 0; i < 2; i++)
{
cout << "\n";
for (int j = 0; j < 3; j++)
{
//cout << *(*(p3 + i) + j)<<", ";//数组的指针的输出
//或者
cout << (*(p3 + i))[j] << ", ";//数组的指针的输出
}
}
cout << "\n上面是对【数组的指针】【栈级别】的测试效果\n\r";
//cout << (*(p3 + 1))[2]<<"\n\r";// (*(p3 + 1))表示第2行的第一个元素地址
//cout <<p3<< "\n";//p3是一个第一行的元素的首地址
//cout << *p3 << "\n";//*p3是一个第一列的元素的首地址
//cout << *(*p3)<< "\n";//*(*p3)是一个第一列的元素的首地址值
//cout << *(*p3+1) << "\n";//*(*p3)是一个第二列的元素的首地址值
//cout << *(*(p3+0)+1) << "\n";//输出第1行(p3+0)第2列的元素值
//cout << *(*(p3+1)+1)<<"\n";//输出第2行(p3+0)第2列的元素值
//注:直接在p3上增加数表示二维数组中每行首元素地址的偏移 ,如p3表示第一行首元素地址 p3+1 表示第二行首个元素地址 但是在 *(p3+x)上增加数,表示某行中 列的元素地址偏移如*(p3+x)+1 表示x行第二列的元素地址
/*
int a[5], i, *pa;
pa = a;
for (i = 0; i<5; i++){
*pa = i;
pa++;
}
pa = a;
for (i = 0; i<5; i++){
printf("a[%d]=%d\n", i, *pa);
pa++;
}*/
//------------------------------------------------------------------------测试指一个数组的数组指针【堆】
int(*p4)[3]=newint[5][3];//对于开辟栈空间的数组指针,因为事实上只有一个指针,那么直接用堆的申请方式New出一个 自定义的数组即可
//我要有一个数组用于放在这个申请好的空间中
int D[5][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 }, { 11, 21, 32 }, { 45, 8, 6 }};
//用于赋值
for (int i = 0; i < 5; i++)//给这个申请的二维空间地址赋值
{
for (int j = 0; j <3; j++)
{
//给这个二维空间每个地址内存赋值
*(*(p4 + i) + j) = D[i][j];
}
}
//用于输出
for (int i = 0; i < 5; i++)//给这个申请的二维空间地址赋值
{
cout << "\n";
for (int j = 0; j <3; j++)
{
//给这个二维空间每个地址内存赋值
cout<<*(*(p4 + i) + j)<<", ";
}
}
//在堆中申请的空间记得清空
delete[]p4;
p4 = 0;
cout << "\n上面是对【数组的指针】【堆级别】的测试效果\n\r";
return 0;
}