不理解* p [3]和(* p)[3]之间的区别

时间:2014-03-10 14:26:23

标签: c pointers

在我的书中,写过*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] 没有示例。任何人都可以给我一个例子吗?

8 个答案:

答案 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

aarray 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数组的第一个元素地址。