理解二维数组中字符串的寻址 #包括 void main() { chars[10][10]; int i; 对于(i=0;i
指针算法的工作方式,理解二维数组中字符串的寻址 #包括 void main() { chars[10][10]; int i; 对于(i=0;i,c,C,指针算法的工作方式,s[i]等于*(s+i)。因此s[1]+1实际上是*(s+1)+1,这与s+2或*(s+2)不一样,让我们先谈谈指针算法。给定指向任何类型的指针T/code>: #include<stdio.h> void main() { char s[10][10]; int i; for(i=0;i<4;i++) scanf("%s",s[i]); printf("%s",s); printf("%s",s+1); printf("%s"
s[i]
等于*(s+i)
。因此s[1]+1
实际上是*(s+1)+1
,这与s+2
或*(s+2)
不一样,让我们先谈谈指针算法。给定指向任何类型的指针T/code>:
#include<stdio.h>
void main()
{
char s[10][10];
int i;
for(i=0;i<4;i++)
scanf("%s",s[i]);
printf("%s",s);
printf("%s",s+1);
printf("%s",s[1]+1);
}
表达式p+1
将计算为类型T
的下一个对象的地址。因此,如果T
是int
,那么p+1
将为我们提供p
之后的下一个int
对象的地址。如果p
是0x8000
和sizeof(int)
为4,则p+1
计算结果为0x8004
如果我们使用数组表达式,事情就会变得有趣。假设如下:
T *p;
除非它是sizeof
或一元&
运算符的操作数,否则“T
的N元素数组”类型的表达式将转换(“衰减”)为“指向T
的指针”类型的表达式,其值将是数组第一个元素的地址
所以如果我们写
T a[N];
表达式a
从“10个元素的int
数组”转换为“指向int
”的指针,a
的值是第一个元素的地址(即&a[0]
)因此表达式a+1
给出了a
后面的下一个整数对象的地址,它正好是&a[1]
1
现在假设我们使用的是二维阵列:
int a[10];
int *p = a + 1;
表达式a
的类型为“int的3元素数组的2元素数组”。在这种情况下,a
将“衰减”为类型“int的3元素数组的指针”,或int(*)[3]
。因此a+1
为我们提供了int的下一个*3元素数组的地址“。再次假设a
从0x8000
开始,且sizeof(int)
为4,则a+1
计算结果为0x800c
1.表达式
a[i]
的计算结果为*(a+i)
;也就是说,我们将i
元素从a
指定的地址偏移,并取消对结果的引用。请注意,这将a
视为指针,而不是数组。在B语言中(C从中派生),数组对象a
将是一个指针对象,其中包含第一个元素的地址(a[0]
)。Ritchie在C中对此进行了更改,以便根据需要将数组表达式转换为指针表达式。int a[2][3];
int (*p)[3] = a + 1;