所以我知道 * 操作符用于乘法和作为指针,但有时我看到 * 操作符,我不确定它的意思。看看这个定义矩阵的代码
#ifndef MATRIX_H
#define MATRIX_H
/* The data structure representing a matrix */
typedef struct {
int rows; /* number of rows */
int columns; /* nuumber of columns */
int **content; /* matrix elements in a two dimensional array */
} matrix_t;
两个星号在这里是什么意思?
我假设**运算符用于二维数组中的指针,但我不确定。
1条答案
按热度按时间ulydmbyx1#
多个间接寻址是一件事--你可以有指向指针的指针,指向指针的指针,指向指针数组的指针,指向指针数组的指针,指向指针数组的指针,指向指针数组的指针,指向返回指针的函数,等等。
此处使用的目的是分配一个指针数组:
这给了我们
然后为每个指针分配一个
int
数组:给我们
mat.content
具有类型int **
,因此表达式*mat.content
具有类型int *
;类似地,表达式mat.content[i]
也具有类型int *
(*p == p[0]
),所以*mat.content[i]
具有类型int
,所以sizeof *mat.content[i] == sizeof (int)
。由于数组下标的工作方式,
mat.content[i][j]
的工作方式与将mat.content
声明为int
的常规二维数组完全相同,只不过不是将所有行分配到一个连续的块中,而是逐行分配。一般规则:
当在 expression 中使用时,
*
会“取消引用”指针-如果您有类似于*p
充当x
的一种别名:对象
p
存储x
的位置,表达式p
的类型为int *
表达式*p
等价于表达式x
-它不仅产生存储在x
中的值,您可以将新值写入x
* 到 **p
,如上所示。上述声明给予了以下关系:
数组下标表达式
a[i]
* 定义 * 为*(a + i)
-给定由a
指定的起始地址,从该地址偏移i
个元素(* 不是字节!*),并解引用结果。数组不是指针,也不存储指向其第一个元素的指针。除非它是
sizeof
、_Alignof
或一元&
运算符的操作数,或者是用于在声明中初始化字符数组的字符串文字,否则类型为“T
的N元素数组“的表达式将被转换或“decay”,类型的表达式“指向T
的指针“,表达式的值将是第一个元素的地址。这一点很重要-如果您声明一个数组a
不存储到其第一元素的地址;相反,每当编译器在上面列出的上下文之外看到 expressiona
时,它基本上会将其替换为与&a[0]
等效的内容。