是什么意思:#include <iostream>
void foo(int a[100])
{
a [1]= 30 ;
std::cout<<a[1]<< std::endl;
}
void boo(int a[100])
{
std::cout<<a[1]<< std::endl;
}
int main()
{
int (*b)[100] = (int (*) [100]) malloc(100 * sizeof(int));
*b[1] = 20;
std::cout<< *b[1] << "\t" << b[1] << std::endl;
foo(*b);
boo(*b);
std::cout<< *b[1] << "\t" << b[1] << std::endl;
}
,这个代码的澄清是什么产生这个结果?
20 0x44ba430
30
30
20 0x44ba430
以上代码输出:
<data
android:host=".*myhost.*"
android:scheme="http"/>
答案 0 :(得分:13)
int (*b)[100]
是一个数组指针,一个可以指向100 int。*b[1] = 20;
是一个严重的运算符优先级错误,它超出了数组的范围。应该是(*b)[1]
。答案 1 :(得分:4)
int (*b)[100]
是一个指向100个元素的int数组的指针。变量b
指向已分配的内存,由malloc:malloc(100 * sizeof(int));
分配,但这只分配一行。
问题出在下一行:*b[1] = 20;
,这与b[1][0]
相同,超出了数组的范围。这会导致程序中出现未定义的行为。
答案 2 :(得分:3)
int foo[100];
将foo
声明为100个整数的数组。 foo
的类型是int [100]
(只需从声明中删除foo)。
int (*b)[100];
将*b
声明为100个整数的数组。这意味着b
是这种数组的指针。因此,您可以编写 b =&amp; foo; 。 b
的类型为int (*)[100]
(同样,只需从声明中删除b)。
但是仅仅指向上面示例中的数组并不是很有趣,因为指向foo
的第一个元素(即指向int的指针)的指针足以访问foo
。不需要指向数组的指针。相反,b
有趣的是动态分配int [100]
的数组。例如:
b = (int (*) [100]) malloc(25 * sizeof(int [100])); // allocates an array of 25 int [100]
b[0][99] = 99; // correct
...
b[24][99] = 24099; // correct
b[24][100] = 24100; // incorrect because each b[i] is an array of 100 integers
b[25][0] = 25000; // incorrect because b is an array of 25 elements (an each element is an array)
因此,您的程序不正确,因为您只分配了一个一个 int [100]
的数组(实际上是100 * sizeof(int) == sizeof(int [100])
)。因此,您可以编写相同的说明:
b[0][0] = 0;
*(b[0]) = 0;
*b[0] = 0;
但*b[1]
不正确。
答案 3 :(得分:3)
int(* b)[100]; 和 int * b [100];
之间存在差异int (*b)[100]; // A pointer to an array of 100 integers.
int *b[100]; // An array of 100 int pointers.
答案 4 :(得分:2)
int (*b)[100]
声明b
是指向100个整数数组的指针。
malloc
行分配指针b
指向的内存。 *b
取消引用指针,从而为我们提供最近分配的内存。 b[1]
只是一个地址,可以重写为b + 1
。该地址是b
指向的整数100个整数。
foo
取pointer to int
并将值30分配给从该指针开始的第二个插槽(读取地址)。 foo
和boo
都只输出该指针中第二个插槽中的内容。
尝试将最后一行更改为
std::cout<< *b[1] << "\t" << b[0] << std::endl;
并查看地址b[0]
与地址b[1]
之间的区别,您会发现它们以100个整数分隔。在我的编译器上,我看到0x190的区别是400字节(整数是4字节,100整数是400字节)。
答案 5 :(得分:0)
我更喜欢通过首先输入它们然后尝试关联和查看来理解奇怪的陈述。
例如,
typedef unsigned char uint8_t; // 8 bit memory
typedef uint8_t b[100]; // create an array b having 100 elements,
// where each element occupies 8 bit memory
typedef uint8_t *e;//create a pointer that points to a 8 bit memory
main()
{
b *c; //create a pointer c pointing to a type b-"array having 100 elements
// & each element having 8 bit memory". This is equivalent to what
// you said - (*b)[100]. Like just moving the *
b d;//create an array d having 100 elements of 8 bit memory
e f[100];//create an array of 100 pointers pointing to an 8 bit memory
}
This也可能有帮助。