再谈C语言中数组和指针之间的互操作

再谈C语言中数组和指针之间的互操作,第1张

再谈C语言中数组和指针之间的互操作,第2张

我曾经说过,在C语言中,只有一维数组(这是我对数组的看法),数组的元素可以是任何类型的数据(或者对象),自然也可以是另一个数组(因为数组也是数据类型)。所以如果你坚持认为有多维数组,也不是不可能。我们要做的就是将一个数组赋给另一个数组的元素。当然,我们必须确保数组的大小在编译时是一个固定的常数。

其实数组的操作很简单。只要我们确定了一个数组的大小和下标为0的元素的指针,任何其他的数组下标操作都等价于一个对应的指针操作,所以我们说“数组和指针可以互相操作”。两者的本质是一样的。我们甚至可以把数组想象成“指针”的集合。

我可以用下面的方式声明一个数组:

char nameint week[7][24];;

该语句声明name是一个包含10个字符元素的数组。类似的

struct student {
int tid[4];
char name[10];
char sex;
char address[25];
} STD[100];

这里说明一下,std是一个有100个元素的数组,std中的每个元素定义了一个学生的基本信息。每个元素都是一个结构,包括一个有4个塑形元素的数组(tid[4]),用来很好的记录学生的学习情况;还有一个10个字符元素的数组(name[10])记录学生的名字;用于记录学生性别的字符(性别);还有一个数组(address[25])记录学生的地址,有25个字符元素。数组是一种非常灵活的结构。

所谓的“二维数组”或“矩阵”很容易声明,例如:

[10]

在这里,声明周被声明为一个有7个数组元素的数组(这个解释不会让你觉得奇怪),其中每个元素是一个有24个整数元素的数组。注意,week不能理解为一个有24个数组元素的数组,其中每个元素是一个有7个shaping元素的数组。另外,如果week不是sizeof的操作数,那么它总是指向week数组起始地址的指针。它又和指针一起跑了。如果一个指向一个数组的元素,那么我们只需要加一个自然数I(0 = int * p;

那么P自然是指向一个整数指针,然后p+1指向计算机内存中的下一个整数,而不是指向该地址的下一个内存位置。也就是说,程序的逻辑地址一般不同于实际的物理地址。

如果有两个元素指向同一个数组,那么我们可以通过这两个指针之间的算术运算得到一些有意义的表达式。举个例子,

int *指针;
int * IP = pointer+I;

然后我们可以通过指向ip-pointer得到I的值。如果ip和ponter不是指向同一个元素,那么我们就不能保证这个操作的正确性,虽然它们在内存地址上相差整数倍。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 再谈C语言中数组和指针之间的互操作

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情