意思是:int(* b)[100]

时间:2016-01-14 12:06:31

标签: c++ pointers

是什么意思:#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"/>

6 个答案:

答案 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个整数。

foopointer to int并将值30分配给从该指针开始的第二个插槽(读取地址)。 fooboo都只输出该指针中第二个插槽中的内容。

尝试将最后一行更改为

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也可能有帮助。