c++指针&指针数组&数组的指针 的测试

// 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;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Unity3d青子

难题的解决使成本节约,求打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值