赞
踩
指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称。
数组指针:首先它是一个指针,它指向一个数组。在32 位系统下永远是占4 个字节,
A)
int *p1[10];
B)
int (*p2)[10]; 等价于 int (*)[10] p2;
运算符优先级: () > [] > *
“[]”的优先级比“*”要高。p1 先与“[]”结合,构成一个数组的定义,数组名为p1,int *修饰的是数组的内容,即数组的每个元素。那现在我们清楚,这是一个数组,其包含10 个指向int 类型数据的指针,即指针数组。至于p2 就更好理解了,在这里“()”的优先级比“[]”高,“*”号和p2 构成一个指针的定义,指针变量名为p2,int 修饰的是数组的内容,即数组的每个元素。数组在这里并没有名字,是个匿名数组。那现在我们清楚p2 是一个指针,它指向一个包含10 个int 类型数据的数组,即数组指针。
所以 A 是指针数组, B是数组指针。
从数组指针(本质是指针)和数组名延伸到指针和数组的区别,参考:指针和数组、指针常量和常量指针的区别_baidu_16370559的博客-CSDN博客
int a[5] = { 1, 2, 3, 4, 5 }
a和&a的值是一样的,但是意义有所区别,a指的是a[0]的地址,&a指的是数组a的地址(“数组名”代表数组第一个元素的地址,“&数组名”代表的是整个数组的地址)。从而导致a+1和&a+1有了本质的差异。
a+1 = a[0]的地址+sizeof(int);(在第一个元素的地址上便宜一个数组元素的大小,即下一个元素,a[1]的地址。)
&a+1 = 数组a的地址+sizeof(a);(在数组的地址上偏移一个数组的大小,此时sizeof(a)中的a是一个数组,不是一个指针,计算出来是一个数组的大小,不是指针的大小)
二维数组和函数
二维数组作为函数的参数,
如int a[3][4] = {(1,1,1,1),(2,2,2,2),(3,3,3,3),};
sum(a,3);
关键是sum申明的原型
1.sum(int (ar*)[4],int size); // int (ar*)[4]表示的是数组指针
2. sum(int ar[][4],int size);
一维数组作为函数参数,函数的声明
1.void testfunc1(int a[],int nsize);
2.void testfunc11(int *a, int nsize);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。