在我的书中,写过*p[3] declares p as an array of 3 pointers
。我知道了。但对于(* p)[3],已写成(*p)[3] declares p as a pointer to an array of three elements
。这是什么意思? (* p)[3] 没有示例。任何人都可以给我一个例子吗?
答案 0 :(得分:12)
int a[3] = {1,2,3};
int (*p)[3];
p=&a;
printf("%d %d %d",(*p)[0],(*p)[1],(*p)[2]);
首先,您必须了解 a和& a 之间的区别。 a和& a 的Value
将相同。但它们的含义存在巨大差异。此处a
代表first element
的{{1}},即array
,&a[0]
代表整个&a
。如果您执行complete array
,您会在a+1
array
中找到下一个元素的地址,但如果您执行&a[1]
,则会提供&a+1
next address
complete array
即&a+1
= &a[2]+1
。因此,此处p=&a
表示您已将address of an array
size 3
分配给pointer p
。
答案 1 :(得分:5)
*p[3]
的示例:int a = 10;
&a; // <-- this is the address of the variable a
int b = 20;
int c = 30;
int *p[3]; // <-- array of three pointers
// p[0] being the first, p[2] being the last and third
// p is the address of p[0]
p[0] = &a;
p[1] = &b; // Stored the addresses of a, b and c
p[2] = &c;
p[0]; // pointer to a
*p[0]; // this is the variable a, it has the value 10
(*p)[3]
的示例:int a[3]; // array of three integers
a[0] = 10;
a[1] = 20;
a[2] = 30;
a; // address of the very first element, value of which is 10
&a; // address of the pointer, the address holding variable
int (*p)[3]; // pointer to an array of three integers
p = &a;
// p is a variable
// p points to a
// a is a variable
// a points to a[0], 10
// a, therefore, is a pointer
// p points to a pointer
// p, therefore, is a pointer to a pointer
写这一切真是有趣,有点儿。我希望它也有助于更好地理解。
答案 2 :(得分:2)
这样的东西?
int a[3]; // int array of size 3
int (*p)[3]; // pointer to int array of size 3
p = &a; // Make p point to the address of a
a
是array
size 3
,可能需要三个元素。
p
被声明为pointer
,它应指向int array of size 3
。
int a;
int *p;
a
是一个整数。
p
是指向整数的指针,而不是整数数组,是一个简单的整数。
简化:将指针视为变量,它的值只是其他变量的地址。您可以指定指针指向的变量类型,在本例中为大小为3的int数组。
答案 3 :(得分:1)
基本上:
int *p[3]; // to access a value you need to do
// *p[1] (take first entry and dereference it)
-------------------------
| first pointer to int | <- p points here
-------------------------
| second pointer to int |
-------------------------
| third pointer to int |
-------------------------
int (*p)[3] // to access a value you need to do
// (*p)[1] (dereference pointer to array and take first value in array)
------------------ \
| first integer | |
------------------ |
| second integer | } p points to the whole array
------------------ |
| third integer | |
------------------ /
答案 4 :(得分:1)
(*p)[3] means pointer to the starting element's address of your array.
*p[3] means an array containing three pointers..
答案 5 :(得分:1)
这是一个指向数组指针的例子;将多维数组作为函数参数传递。
除非它是sizeof
或一元&
运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字,否则表达式为“N-element array of T
“将被转换(”衰减“)为”指向T
的指针“的表达式,表达式的值将是数组的第一个元素的地址。
因此,假设以下代码:
int foo[5][5];
bar( foo );
对foo
的调用中的表达式bar
具有类型“5元素数组int
的5元素数组”;由于foo
不是sizeof
或一元&
运算符的操作数,因此它将转换为类型为“指向int
的5元素数组的指针”的表达式,或int (*)[5]
(在这种情况下,T
==“5个元素数组int
”)bar
的定义必须类似于
void bar ( int (*arr)[5] ) { ... }
参数arr
具有类型“指向int
的5元素数组的指针”。 *arr
周围的括号是必要的,因为[]
下标运算符的优先级高于一元*
运算符,因此像*p[i]
这样的表达式被解析为*(p[i])
;你取消引用下标操作的结果。要强制取消引用在下标之前发生,您需要使用标识符*
显式地对一元(*p)[i]
运算符进行分组。
在函数参数声明的上下文中,T a[]
和T a[N]
被视为T *a
;所有这三个都将a
声明为指向T
的指针。因此,您可以将函数定义编写为
void bar ( int arr[][5] ) { ... }
甚至
void bar ( int arr[5][5] ) { ... }
在所有三种情况下,arr
是指向int
的5元素数组的指针。我更喜欢明确地写出指针类型,因为这就是实际发生的事情;其他人更喜欢使用2D数组语法,因为它更容易阅读。
答案 6 :(得分:0)
http://stackoverflow.com/questions/1810083/c-pointers-pointing-to-an-array-of-fixed-size
上面的链接可能会帮助您更多地理解这个概念..
答案 7 :(得分:0)
关于(*p)[3]
的问题。
int b[2][3]={{10,20,30},{40,50,60}};
//两个3个整数值的1-D数组。第一个数组是b [0]第二个数组是b [1]。
这里b将返回一个指向3个整数值的1-D数组的指针。 b返回我们int (*)[3]
。这意味着指针一维三维数组。
所以
*p=b; // is not valid.
但
(*p)[3]=b; // is valid.
因为p是指向三个元素数组的指针
如果打印p或* p或p [0]或&amp; p [0] [0]则会打印第一个1-D数组的第1个元素地址。
如果打印p + 1或*(p + 1)或p [1]或&amp; p [1] [0]然后它将打印第二个1-D数组的第一个元素地址。