[英]Using a pointer to point to a certain row in c
如果我有数组a
,我将如何设置指向第一行的指针?
double a[2][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}};
您可以声明一个指向行的指针并使用以下行将其初始化为指向第一行:
double (*p_first_row)[4] = &a[0];
由于数组到指针衰减,您还可以编写:
double (*p_first_row)[4] = a;
括号是必要的,因为声明
double *p[4];
声明一个指针数组,而声明
double (*p)[4];
声明一个指向数组的指针。
如果您有一个多维数组,例如
T a[N1][N2][N3][N4];
其中T
是某个类型说明符, N1
, N2
, N3
, N4
是一些正整数,然后要创建指向数组第一个元素的指针,只需将最左边的维度更改为星号
T ( *p )[N2][N3][N4] = a;
在此声明中,数组指示符a
被隐式转换为指向其第一个元素的指针。
如果要获取指向数组的第 i 个( 0 <= i < N1
)元素(即T[N2][N3][N4]
类型的数组)的指针,您可以编写
T ( *p )[N2][N3][N4] = a + i;
或者
T ( *p )[N2][N3][N4] = a;
p += i;
这是一个演示程序。
#include <stdio.h>
int main( void )
{
double a[2][4] =
{
{1, 2, 3, 4},
{5, 6, 7, 8}
};
for ( double ( *row )[4] = a; row != a + 2; ++row )
{
for ( double *p = *row; p != *row + 4; ++p )
{
printf( "%.1f ", *p );
}
putchar( '\n' );
}
}
程序 output 是
1.0 2.0 3.0 4.0
5.0 6.0 7.0 8.0
只需像对任何指针一样正常取消引用它。 *(a + 0)
为您提供矩阵的第一行, *(a + i)
将为您提供二维数组中的i-th
行。
获取二维数组每一行中第一个元素的示例代码如下所示。
double a[2][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}};
for (int i = 0; i < 2; i ++) {
printf("%lf ", *(a + i)[0]);
}
Output:
1 5
double a[2][4]
= 一个大小为 2 的数组,每个项的类型为double[4]
。double (*p)[2][4]
并初始化/分配为p=&a
。double a[4]
类型数组的指针被声明为double (*p)[4]
。double a[2][4]
的第一项具有类型double [4]
,因此无论何时在表达式中使用, a
都会衰减为指向此类项的指针double (*)[4]
。 因此,如果我们愿意,我们可以像这样迭代double a[2][4]
:
double a[2][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}};
for(double (*p)[4]=a; p<a+2; p++)
{
printf("%lf %lf %lf %lf\n", (*p)[0],(*p)[1],(*p)[2],(*p)[3]);
}
这也相当于double (*p)[4]=&a[0]
。
现在假设我们用更合理的语法编写了一个表达式,我们应该这样做:
a[i][j]
根据定义,任何a[i]
表达式都 100% 等效于*(a+i)
。 所以上面等价于*(*(a+i)+j)
。
这里使用了两次指针运算: a+i
是对double(*)[4]
类型的指针运算,将地址增加i * sizeof(double[4])
字节。 而+j
部分是double*
上的指针运算,用j * sizeof(double)
字节增加地址。
因此a[1][0]
= (char*)a + 1 * sizeof(double[4]) + 0 * sizeof(double)
例子:
#include <stdio.h>
int main()
{
double a[2][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}};
printf("%lf ", a[1][0] );
printf("%lf ", (char*)a + 1 * sizeof(double[4]) + 0 * sizeof(double) );
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.