3

Is following two are same in C++ ?

First:

    int a[10] = {0,1,2,3,4,5,6,7,8,9};

and Second,

    int *a = {0,1,2,3,4,5,6,7,8,9};
4

4 回答 4

11

第一个是整数数组,第二个是指向整数的指针。所以不,他们不一样。

数组可以用作指针(因为数组衰减为指向第一个元素的指针),并且指针可以用作数组,但是对于编译器来说它们是不同的。

此外,该数组将在编译时具有固定的大小,它将是十个整数的大小,sizeof并将返回(对于最常见40的 32 位)。int指针的大小是指针的大小,而不是它指向的内容。因此sizeof对指针执行操作将返回4(在 32 位机器上)或8(在 64 位机器上)。

另一个也是...... C++没有“文字数组”,所以你不能分配给这样的指针。您必须先分配内存,然后再分配。不过,它可以使用新的 C++11 标准一步完成:

int* a = new int[10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

请记住,如果您像上面那样分配内存,您还必须释放它:

delete[] a;
于 2013-05-29T07:15:57.270 回答
5

我认为那int *a={0,1,2,3,4,5,6,7,8,9}会失败。

您需要为此数组分配内存,然后进行放置

于 2013-05-29T07:15:40.850 回答
1

以相同的方式使用这两个数组将导致相同的结果。

printf("%d\n", a[3]);

不同之处在于编译器如何看待这两个数组

  • a[x]版本a引用了数据。a is是数据开始的地址
  • *a版本创建一个指向aint 或多个)的指针。在这种情况下,a引用指向int的指针。与 相比,这是一个额外的间接a[]
  • 因为*a是一个指针,你可以改变它的值,而你不能改变它的aa[]

例如

 int *a;
 a = malloc(sizeof(int) * 10);
 a = &otherint;
 ...

尽管

 int a[3] = { 1, 2, 3 };
 a = malloc(sizeof(int)); // <== ERROR

对于初始化,只能a[]直接接收值。*a需要int分配

 int *a = { 1, 2, 3}; // <== ERROR
于 2013-05-29T07:15:55.960 回答
1
int a1[10]={0,1,2,3,4,5,6,7,8,9};

a1是一个数组,所以当 a 超出范围时,内存会被释放

否则int *a2={0,1,2,3,4,5,6,7,8,9} a2是一个指针(我认为你不能像那样初始化它),即使你这样做a2 = a1,内存仍然是由 a1“拥有”的。
使用 可以看到 a1 和 a2 是不同的类型sizeof。a2 只是指针的大小,而 a1 是sizeof(int) * 10

于 2013-05-29T07:18:34.613 回答