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] 数组第一个元素一般情况,定义一般指针就可以了!
一级指针的地址可以赋值给二级指针
 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 }

 

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-11-02
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-08-31
  • 2022-12-23
猜你喜欢
  • 2021-08-18
  • 2021-06-27
  • 2021-05-27
  • 2022-12-23
  • 2022-12-23
  • 2021-09-24
  • 2022-12-23
相关资源
相似解决方案