2012-02-28 142 views
0

如果我在函数以下代码:访问元素

int A[5][5]; 
    int i; int j; 
    for(i=0;i<5;i++){ 
    for(j=0;j<5;j++){ 
     A[i][j]=i+j; 
     printf("%d\n", A[i][j]); 
    } 
    } 

这仅仅打印出各指标的总和。我想知道的是,是否有可能以类似于动态数组的方式访问静态数组中的每个索引。因此,举例来说,如果我想访问A [2] [2],可我说:

*(A+(2*5+2)*sizeof(int))? 

我想在静态分配矩阵进行一些矩阵运算,我觉得用来解引用动态矩阵的方法将最适合我的目的。有任何想法吗?谢谢。

+1

该数组并非像您声明的那样是静态的。 – 2012-02-28 20:44:46

+0

如果解除引用的指针是指向int的指针,则sizeof()的乘法是不必要的。指针指向的指针类型大小的指针算术步骤。 – dmckee 2012-02-28 20:48:35

+1

@dmckee不仅没有必要,而且是错误的。首先,它不会做他期望的事情,其次,你可以越过数组的边界并进入未定义的行为。 – 2012-02-28 20:50:30

回答

4

就是这么做的:A[i][j]

它打印出索引的总和,因为您将元素A[i][j]设置为索引之和:A[i][j] = i+j

+0

我认为OP正在询问如何使用指针算法来访问一个元素。关于数据分配方式的问题更多的是关于访问数据的“正确”方式。 – 2012-02-28 21:09:22

+0

@AdamLiss可能会,或者他感到困惑,他得到了索引的总和。 – 2012-02-28 21:11:34

+1

@LuchianGrigore:我读过这样一句话,“这只是打印出每个索引的总和”,与你阅读它的方式有些不同。你读它为:“问题是,这应该打印出数组元素,而是打印出索引的总和。”我读它为:“这只是简单的代码来展示我的意思;它打印出数组元素,它们被设置为它们索引的总和。” – ruakh 2012-02-28 22:18:06

1

您可以使用:

*(*(A + 2) + 2) 

A[2][2]。指针运算是以不在char单位的指针类型为单位完成的。

当然,首选的方法是在您的程序中使用A[2][2]

+0

只是'A [2] [2]'有什么问题? – 2012-02-28 20:47:31

+0

@LuchianGrigore我认为OP用显式指针算术问'A [2] [2]'的等价性。 – ouah 2012-02-28 20:49:30

+0

@LuchianGrigore'A [2] [2]'它没有错。但他正在寻求一种使用其指针值访问“A”元素的方法。 – 2012-02-28 20:49:49

0

下标操作a[i]被定义为*(a + i) - 你计算i元件(不是字节)的从a一个偏移量,然后解除引用的结果。对于二维数组,你只要申请该定义递归:

a[i][j] == *(a[i] + j) == *(*(a + i) + j) 

如果数组连续分配的,你也可以只写*(a + i * rows + j)

在进行指针运算时,会考虑基本类型的大小。给定一个指针

T *p; 

表达p + 1将评估为T类型的下一个对象,该对象是psizeof T字节的地址。

请注意,使用指针运算可能不会比使用下标运算符更快(编码两个版本并通过分析器运行它们以确保)。它会肯定可读性较差。

0

指针算术可能会很棘手。 您正处于正确的轨道上,但是指针和正常算术之间存在一些差异。 例如考虑这个代码

int I = 0; 
float F = 0; 
double D = 0; 
int* PI = 0; 
float* PF = 0; 
double* PD = 0; 

cout<<I<<" "<<F<<" "<<D<<" "<<PI<<" "<<PF<<" "<<PD<<endl; 
I++;F++;D++;PI++;PF++,PD++; 

cout<<I<<" "<<F<<" "<<D<<" "<<PI<<" "<<PF<<" "<<PD<<endl; 
cout<<I<<" "<<F<<" "<<D<<" "<<(int)PI<<" "<<(int)PF<<" "<<(int)PD<<endl; 

如果你运行它看你会看到会看起来像这样的输出(取决于您的架构和编译)

0 0 0 0 0 0 
1 1 1 0x4 0x4 0x8 
1 1 1 4 4 8 

正如你可以看到指针运算根据它指向的变量的类型处理

因此请记住使用指针算术时您访问的是哪种类型的变量。

只是为了举例起见考虑下面的代码太:

void* V = 0; 

int* IV = (int*)V; 
float* FV = (float*)V; 
double* DV = (double*)V; 

IV++;FV++;DV++; 
cout<<IV<<" "<<FV<<" "<<DV<<endl; 

你会得到输出(同样取决于你的架构和编译)

0x4 0x4 0x8 

记住上面的代码片段仅用于演示目的。有很多东西不从这里使用