如果我在函数中有以下代码:
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))?
我想对静态分配的矩阵执行一些矩阵运算,我觉得用于取消引用动态矩阵的方法对我的目的最有效。有任何想法吗?谢谢。
答案 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
请记住,上面的代码段仅用于演示目的。从这里开始有很多不使用的东西。