64,682
社区成员
发帖
与我相关
我的任务
分享
#include<iostream>
using namespace std;
template<typename T,int M,int N>
void GetLine(T (&a)[M][N])
{
for(int i=0;i <M;i++)
for(int j=0;j <N;j++)
cout <<a[i][j] <<endl;
}
int main()
{
int a[2][2]={{1,2},{3,4}};
int b[3][3]={0,1,2,3,4,5};
GetLine<int,2,2>(a);
GetLine<int,3,3>(b);
system("pause");
}
#include <stdio.h>
#include <stdlib.h>
void f(){
char a[11][8] ;//
char **p; //
const int cou=sizeof(a)/sizeof(a[0]);//用二维数组所站空间的大小除以其中一维所站空间的大小,计算出这个二维数组中包含多少个一维数组。
printf("***%d***\n",cou);
p=(char**)malloc(sizeof(char*)*cou);//一个内存地址放入一个指针变量是天经地义的
for(int i=0;i<cou;i++)
{
p[i]=a[i];//因为已经给p分配了指向,且是cou个元素的内存,所以使用p[0]到p[cou-1]可以合法访问这段内存。
//因为a[0],a[1]也是代表一段内存的地址,把它存入类型为char*的内存中是没有问题的(p[i]的类型为char*).
//此后*p访问到的是malloc分配的那段内存之首,而且那里存放的是一个地址,也就是a[0]所代表的地址,其值与&a[0][0]相同。
for(int j=0;j<sizeof(a[0]);j++)
{
p[i][j]=65+i+j;//这里的**p与p[0][0]等价,p[0][1]就是(*p)[1]也就是*(*p+1),总之p[i][j]就是*(*(p+i)+j),晕了吧,我也可能会晕了写错。
//从简单的来推一下:char arr[10]; arr[0]就是*(arr+0),arr[1]就是*(arr+1),也就是数组的下标是相对于数组首地址的偏移,理解c的下标为什么要从0开始了吧
//从简单到复杂,与上行同理p[i]就是*(p+i),p[i][j]就是(*(p+i))[j],就是*(*(p+i)+j)。
}
}
for(int c=0;c<cou;c++)
{
for(int d=0; d<sizeof(a[0]);d++)
{
printf("%c,",p[c][d]);
}
printf("\n");
for(int e=0; e<sizeof(a[0]);e++)
{
printf("%c>",*(*(p+c)+e));//这样访问输出给你比较
}
printf("\n");
}
}
int main()
{
f();
return 0;
}
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
int a[2][2]={{1,2},{3,4}};
int* p = (int*) a;
for(int i=0;i <2;i++)
for(int j=0;j <2;j++)
cout <<p[j+i] <<endl;
return 0;
}
#include <iostream.h>
int main(int argc, char* argv[])
{
int a[2][2]={{1,2},{3,4}};
int **p=(int**)a;
for(int i=0;i <2;i++)
for(int j=0;j <2;j++)
cout < <p[j][i] < <endl;
return 0;
}
int main(int argc, char* argv[])
{
int a[2][2]={{1,2},{3,4}};
int (*p)[2] = a; //改下这里
for(int i=0;i <2;i++)
for(int j=0;j <2;j++)
cout << p[j][i] <<endl;
return 0;
}
int (*p)[2]=a;