#include <iostream>
using namespace std
void output_Subscript(int p[ ][4],int n)
void output_Line(int p[ ][4],int n)
void output_Column(int *p,int n)
int main()
{
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}
cout<<"(1)下标法进行二维数组输出"<<endl
output_Subscript(a,3)
cout<<"(2)行指针法进行二维数组输出"<<endl
output_Line(a,3)
cout<<"(3)列指针法进行二维数组输出"<<endl
output_Column(a[0],12)
return 0
}
void output_Subscript(int p[ ][4],int n)
{
int i,j
for(i=0i<ni++)
{
for(j=0j<4j++)
cout<<p[i][j]<<" "
cout<<endl
}
}
void output_Line(int p[ ][4],int n)
{
int i,j
for(i=0i<ni++)
{
for(j=0j<4j++)
cout<<*(*(p+i)+j)<<" "
cout<<endl
}
}
void output_Column(int *p,int n)
{
int i
for(i=0i<ni++)
{
cout<<*(p+i)<<" "
if((i+1)%4==0)
cout<<endl
}
}
首先数组的访问有三种形式:1)下标法;2)首地址法;3)指针变量法。这里我们先分析首地址法。
假设有一个二维数组a[3][4],a就是首地址,他是一个指针是一个常量,指向第一个元素的地址,也就是指向第一行的首地址,是指首行一整行,并不是指某个具体元素。那么我们称之为“行指针”。同理:a+0,a+1,a+2,都是行指针如下表所示。
但我们发现光有行指针是不能对列元素进行访问的。所以我们再来看a[0],他也就是这个数组的首地址,也就是第一个元素的地址,只不过指针方向是指向列的方向。也就是a[0]+0。a[0]和a[0]+0都是指具体的元素,那么我们称之为“列指针”,如下表所示。
那么两个概念之间的具体转换是:
*行指针----列指针
&列指针----行指针
对应关系如下表所示
根据以上转换公式:
对于元素a[1][2],其地址用列指针表示为a[1]+2,等价表示为*(a+1)+2,那么内容是*(*(a+1)+2);
char arr[3]={'a','b','c'}char (*ch)[3]=&arr
for(int i=0i<3i++){
printf("%c ",ch[0][i])
}
不过不建议这样的代码。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)