C 为什么内存地址不同';字符数组的两个元素的类型4?

C 为什么内存地址不同';字符数组的两个元素的类型4?,c,arrays,memory,C,Arrays,Memory,我在C语言中胡思乱想,试图找到一种解释内存地址差异的方法,当我找到两个相邻的数组元素并找到差异时。这是我的密码: #include <stdio.h> int main(){ char *a[5]; printf("%p\n", (&a[0])); printf("%p\n", (&a[1])); return 0; } 执行此操作时,输出不应该是表单的某些内容: 0x0....0 0x0....1 因为字符指针的大小应该是1(在我使用的32位系

我在C语言中胡思乱想,试图找到一种解释内存地址差异的方法,当我找到两个相邻的数组元素并找到差异时。这是我的密码:

#include <stdio.h>

int main(){
  char *a[5];
  printf("%p\n", (&a[0]));
  printf("%p\n", (&a[1]));
  return 0;
}
执行此操作时,输出不应该是表单的某些内容:

0x0....0
0x0....1
因为字符指针的大小应该是1(在我使用的32位系统上)


如果有人知道为什么会出现这种情况,并能提供解释,这将非常有用。

字符的大小是
1
,字符的大小取决于实现,通常
4
32
-位系统中。

如果您声明一个字符数组而不是字符数组*,您将得到预期的结果。注意行
字符a[5]

$ cat foo.c
#include <stdio.h>

int main(){
  char a[5];
  printf("%p\n", (&a[0]));
  printf("%p\n", (&a[1]));
  return 0;
}

$ foo
0x7fff5e1119d7
0x7fff5e1119d8
$cat foo.c
#包括
int main(){
chara[5];
printf(“%p\n”,(&a[0]);
printf(“%p\n”,(&a[1]);
返回0;
}
$foo
0x7fff5e1119d7
0x7fff5e1119d8

字符a[5]
可容纳5个字符
char*a[5]
保留5个指向字符的指针。

或者更详细地说,您声明了一个字符指针数组,而不是一个字符数组。因此,数组的每个元素都是一个指针,@ouah指出,在
32
位系统中,指针的大小通常是
4
。哈,以前从未注意到这一点。如果我使用的是64位系统,指针会是8个字节吗?因为一个字符是2?@sy是的,64位指针是8个字节,而不是,一个字符仍然是1byte@Sythe
char
的大小总是
1
。我猜您想问“char*数组4的两个元素的内存地址为什么不同?”`
$ cat foo.c
#include <stdio.h>

int main(){
  char a[5];
  printf("%p\n", (&a[0]));
  printf("%p\n", (&a[1]));
  return 0;
}

$ foo
0x7fff5e1119d7
0x7fff5e1119d8