查看原文:http://blog.xieyc.com/pointer-and-operator-precedence-in-c-programming-language/
因为现在都用C#、Java一类的类型安全的语言了,关于最基本的C语言中和指针相关的几个概念,每次看懂之后,过一段总是又忘了……这次记下来:
一、关于 int*
上述两种形式在使用上没区别,当使用 int* p,q 和 int *p,q
的时候才会体现出区别。(牢记这一点有利于理解下文的内容,我个人习惯前一种写法,比较方便理解。)
注意:这两种形式不涉及间址运算符*在结合性上的优先级(完全由space决定)。
二、涉及数组 int
1. int *p[n]
由于 [] 优先级比 * 高,因此 p 先与 [] 结合,将其理解为 int* p[n] 更容易,即 p
是一维数组名,数组 p[n] 的元素类型为 int*(指向int对象的指针)。举一例:
[code language='csharp']
int a=b=c=0;
int *p[3]={ &a, &b, &c };
[/code]
数组名的实质是指针,因此指针p也可以当做二维数组名处理,等效于int p[][n]。考虑以下代码:
[code language='csharp']
int a[2][3] = { {1,2,3}, {4,5,6} };
int (*p)[3];
因为现在都用C#、Java一类的类型安全的语言了,关于最基本的C语言中和指针相关的几个概念,每次看懂之后,过一段总是又忘了……这次记下来:
一、关于 int* p 和 int *p 的区别:
上述两种形式在使用上没区别,当使用 int* p,q 和 int *p,q
的时候才会体现出区别。(牢记这一点有利于理解下文的内容,我个人习惯前一种写法,比较方便理解。)注意:这两种形式不涉及间址运算符*在结合性上的优先级(完全由space决定)。
二、涉及数组 int *p[n] 和 int (*p)[n] 等:
1. int 由于 [] 优先级比 * 高,因此 p 先与 [] 结合,将其理解为 int*
[code language='csharp']
int a=b=c=0;
int *p[3]={ &a, &b, &c };
[/code]
2. int (*p)[n]
由于p先与*结合,声明p为一指针,其指向一个int[n],即具有n个int元素的一维数组。数组名的实质是指针,因此指针p也可以当做二维数组名处理,等效于int p[][n]。考虑以下代码:
[code language='csharp']
int a[2][3] = { {1,2,3}, {4,5,6} };
int (*p)[3];
