Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解二维数组中字符串的寻址 #包括 void main() { chars[10][10]; int i; 对于(i=0;i_C - Fatal编程技术网

理解二维数组中字符串的寻址 #包括 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;