区分int *p[4]与int (*p)[4]

1、int(*p)[4];------ptr为指向含4个元素的一维整形数组的指针变量(是指针)
2、int *p[4];-------定义指针数组p,它由4个指向整型数据的指针元素组成(是数组)
3、int(*)[4];--------实际上可以看作是一种数据类型。也就是第一个(int(*p)[4];)中定义的p的数据类型
其实你要看这种到底是什么,就是要看他最先和谁结合。 比如1中p先与*结合,那就说明p本质是一个指针;而2中p先与后面的[4]结合,说明他本质是一个数组。再慢慢理解
数组不赋初值的话是没有值的,其他地方就不能引用这个数组的值,因为他本身没有值。这个和全局变量不一样,全局变量不赋值是默认0。
数组不赋初值的话是没有值的,都是未知的垃圾数据。你可以写个程序尝试一下!
#include <stdio.h>
int main()
{
int i;
int a[10];
for(i=0;i<10;i++)
printf("%d ",a[i]);
}
int(*p)[4] 是一个指向4个整形数数组的指针 
int*p[4]是一个有4个指针的数组,该指针是一个指向一个整型数的。
这个在c语言里是难点,初学时很容易混淆,不过你先找变量,然后先往右看,如果遇到圆括号(一般是圆括号,而且是右半边,如果是左半边就说明它是一个函数)就往左,比如第一个p先往右,然后遇到括号,所以往左看到*,证明他是一个指针,是一个指向整形数数组的指针。第二个,p向右,是一个数组,是一个有4个指针的数组


int *p[4]中定义的p是有4整型指针的数组

int(*q)[4] q是指向具有4个整型元素的数组的指针!
用法
int f[10];
int x[4],y[4],z[4],w[4];
int a,b,c,d;
int *p[4] ={&a,&b,&c,&d};
p[0]= &a;p[1]=b;p[2]=&c;p[3]=&d;



int *p[4] ={x,y,z,w};

p[0]= x;p[1]=y;p[2]=z;p[3]=w;

//*(p[0]+1) == x[1]
p[0]+1 == x+1;

都是可以的;
初始化:
int(*q)[4] ={&a,&b,&c,&d};//不可以int(*)[4]与int* [4]不兼容;
int(*q)[4] ={x,y,z,w}; ;//不可以int(*)[4]只是一个指针;

int(*q)[4] =x ; //不可以 q 是int(*)[4]; x是int* 不兼容;

int(*q)[4] =&x ; //q,&x 都是 可以int(*)[4] ;
int(*q)[4] =&f ; // 不可以q 是 int(*)[4],&f是int(*)[10];不兼容

赋值:
q =x ; //q 不可以 q 是int(*)[4]; x是int* 不兼容;

q ={&a,&b,&c,&d};//不可以int(*)[4]与int* [4]不兼容,不可以这样赋值;

q ={x,y,z,w}; ;//不可以int(*)[4]只是一个指针,是个4个整型元素数组的指针;
//{} 内是int *[4] 是个int *指针的数组
q =&x ; //可以q,&x 都是 int(*)[4] ;
q =&f ; // 不可以q 是 int(*)[4],&f是int(*)[10];不兼容
*q 是个四个元素的数组
(*q)+1 数组第一个元素的地址
(*q)[1] 数组第一个元素一般情况,定义一般指针就可以了!
数组指针作用不是很大,因为对数组的引用通常是不包括数组长度的,
参数传递时长度要另外传递进来。
而数组指针把长度固定死了。不适宜传给函数。
而C又没有可变数组,数组指针只能指向定长数组。所以很少使用。
实际上只要看到,那种写法,能够理解就可以了!
真正是用的都是一般的指针和指针的指针
也就是一级,二级和多级指针
二级以上使用的也很少!
倒是函数的指针用的还多些!
所以只要理解指针本身的概念就够了,指针就是带类型的地址!
可以通过这个地址获得地址中的值 ( *p )!
变量和数组(变量族)都有一个地址,
&用于获取该地址
* 用于取指针所指地址中的值。

变量赋值,是向该地址存入所赋的值,
赋值给别的变量是
把该地址中的变量的值
存入另一个变量的地址中,
所以可以通过地址本身存取变量的值
指针的值是一个地址,通过指针的值( 就是该地址)可以读写地址中的值。
如果是函数指针,可以调用函数(函数名本身就是函数指针)。
这就是指针的用途。
指针也有地址他的地址可以付给高一级的指针
一级指针的地址可以赋值给二级指针
 1 int (*p)[4]
 2 p是一个指针,指向 int[4] 数组
 3 
 4 
 5 int main()
 6 {
 7     int a[4];
 8     int b[3][4];
 9 
10     int (*p)[4];
11 
12     p = &a;
13     p = b;
14 
15     return 0;
16 }

 

posted @ 2013-06-10 22:20  herizai  阅读(1994)  评论(0编辑  收藏  举报