它们在C和C ++上的工作方式是否不同?
int *a[5] -
这意味着"a"是一个指针数组,即数组中的每个成员都是指向整数类型的指针;
数组的每个成员可以保存一个整数的地址。
int (*a)[5] -
在这里,"a"是一个指向包含5个整数的数组的指针,换句话说,
"a"指向一个包含5个整数的数组。
示例:
#include<stdio.h>
int main()
{
int b = 3;
int c = 4;
int *a[2] = {&b, &c}; // is same as ---int *a[] = {&b, &c}
printf("value pointed to by a[0] = %d, by a[1] = %d\n", *a[0], *a[1]);
return 0;
}
是的,有很大的区别。让我们看一些代码:
#include <stdio.h>
int main()
{
int *a[5]; // same as: int *(a[5]);
int(*b)[5];
printf("*a[5] vs (*b)[5] : %d vs %d", sizeof (a), sizeof(b));
// *a[5] vs (*b)[5] : 20 vs 4
}
这是什么意思?
第一种情况(int *a[5])是指向整型的5个指针数组
而第二种情况(int(*b)[5])是指向包含5个整型的数组的指针。
区别在于这里的()。
是的,这种行为在C和C++中是相同的。
这是一个包含5个指向整型变量的指针的数组:
int* a[5];
这是一个指向包含5个整数的数组的指针:
int (*a)[5];
int a[5] = {0, 1, 2, 3, 4};
int (*p)[5]; // pointer to array of 5 ints
int* b[5]; // array of 5 pointers to int
p = &a; // p points to a
for (int i = 0; i < 5; ++i)
std::cout << (*p)[i] << " ";
std::cout << std::endl;
// make each element of b point to an element of a
for (int i = 0; i < 5; ++i)
b[i] = &a[4-i];
for (int i = 0; i < 5; ++i)
std::cout << b[i] << " ";
std::cout << std::endl;
int* a[5]; int* b=a[0]; int b[5]; int (*c)[5]=&b; int y=(*c)[0]
@RaghavSharma int* a[5]; int* b=a[0]; int b[5]; int (*c)[5]=&b; int y=(*c)[0]
- IdeaHatp
,我们能否让它指向大小大于5的数组,还是它在整个程序中只限于大小为5? - The Roomint* a[5]
声明 a
为指向 int 的指针数组,长度为 5。
int (*a)[5]
声明 a
为指向包含 5 个 int 元素的数组的指针。
我建议您使用CDeclarer来理解这样或任何复杂的声明。