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};
第一个是整数数组,第二个是指向整数的指针。所以不,他们不一样。
数组可以用作指针(因为数组衰减为指向第一个元素的指针),并且指针可以用作数组,但是对于编译器来说它们是不同的。
此外,该数组将在编译时具有固定的大小,它将是十个整数的大小,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;
我认为那int *a={0,1,2,3,4,5,6,7,8,9}
会失败。
您需要为此数组分配内存,然后进行放置
以相同的方式使用这两个数组将导致相同的结果。
printf("%d\n", a[3]);
不同之处在于编译器如何看待这两个数组
a[x]
版本a
引用了数据。a
is是数据开始的地址*a
版本创建一个指向a
int (或多个)的指针。在这种情况下,a
引用指向int的指针。与 相比,这是一个额外的间接a[]
。*a
是一个指针,你可以改变它的值,而你不能改变它的a
值a[]
例如
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
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