使用C中的指针(算术)访问静态数组中的元素

时间:2012-02-28 20:43:05

标签: c arrays

如果我在函数中有以下代码:

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))?

我想对静态分配的矩阵执行一些矩阵运算,我觉得用于取消引用动态矩阵的方法对我的目的最有效。有任何想法吗?谢谢。

4 个答案:

答案 0 :(得分:4)

这是方法:A[i][j]

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

答案 1 :(得分:1)

您可以使用:

*(*(A + 2) + 2)

代表A[2][2]。指针算术以尖头类型为单位完成,而不是以char为单位。

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

答案 2 :(得分:0)

下标操作a[i]定义为*(a + i) - 您从i计算a元素(非字节)的偏移量,然后取消引用结果。对于2D数组,您只需递归地应用该定义:

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

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

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

T *p;

表达式p + 1将计算为T类型的下一个对象的地址,sizeof T之后为p个字节。

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

答案 3 :(得分: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

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