数组与指针

数组:由一系列类型相同的元素构成。

声明&初始化一维数组

int power[4] = {1, 2, 3, 4};
当在使用的时候,编译器不会检查数组索引的合法性,不检查边界能够让C程序的运行速度更快。e.g. power[5]编译器不会认为有问题,但是在运行的时候,就会得到随机值

声明二维数组

float rain[5][12];
上面定义的二维数组,首先是包含5个元素的数组,并且每个元素都是包含12个float数值的数组。

指针:其数值为地址的变量,上面提到的数组实际上是一种变相使用指针的形式,然而只有是指针变量,才可以使用ptr++这样的表达式,数组不行,数组名是一个常量

声明&初始化指针

int number;
int * ptr = &number; //定义指针变量的时候,一定要对其初始化,不然指针ptr的指向是随机的
int * ptr1 = power; //上面定义的power数组,数组名就是该数组的首地址

对一个指针变量加1的结果是对该指针增加一个存储单元,对于指向数组的指针,地址会增加到下一个元素的地址,而不是下一个字节。

ptr1 +1 == &power[1] //具有相同的地址
*(ptr1 + 2) == power[2] //具有相同的值
声明指向多维数组的指针

int (* ptr2)[12] = rain; //表示ptr2指向了包含12个int值的数组指针,用于指向二维数组
int * ptr3[12]; //表示12个指向int值的指针数组
在声明的 数组指针的时候,一定要加上圆括号,因为[ ]的优先级高于*,不然就成了 指针数组了。关于 C语言运算符的优先级与结合性博文

数组指针与指针数组的区别

  • 数组指针是指向数组首元素的地址的指针,其本质是指针(这个指针存放的是数组首地址的地址,想当于2级指针,这个指针不可移动)
  • 指针数组是数组元素为指针的数组,其本质为数组
  • 系统分配地址空间也不一样

char a[3][8]={"gain", "much", "strong"}; //可以直接把二维数组赋值给数组指针
char *n[3]={"gain", "much", "strong"}; //为指针数组

分析*(*(ptr2+2)+1)

ptr2第一个大小为12个int元素的地址
ptr2+2第三个大小为12个int元素的地址
*(ptr2+2)第三个元素,即包含12个int值的数组,也是该数组第一个元素的地址
*(ptr2+2)+1包含12个int值得数组的第二个元素的地址
*(*(ptr2+2)+1)数组第三行第二列的值,即rain[2][1]
const在声明指针时候的作用, 声明带有const的变量,必须要进行初始化

const int * pt; //不可以修改指向的数据,可以修改指向的地址
int const * pt; //可以修改指向的数据,不可以修改指向的地址
const int const * pt; //指向的数据和指向的地址都不可以修改
使用地址在做参数的时候,定义和声明函数的格式,声明函数的时候, 可以把变量名省略,而定义函数不行

int sum(int *ar)//定义函数
{
}
int sum(int ar[]) //定义函数
{
}

int sum(int *ar); //声明函数
int sum(int ar[]); //声明函数
int sum(int *); //声明函数
int sum(int []); //声明函数

多维数组在做函数参数的声明时,必须要指明列包含多少元素

int sum(int (*ar)[4]); //和下面声明一样,但必须指明包含指向多少int类型的指针
int sum(int ar[][4]); //ar[]其实就是指针
int sum(int ar[][]); //这样声明不正确
复合文字:C99新增加的

int diva[2] = {10, 20}; //普通数组声明
(int [2]) {10, 20} //复合文字,省去了数组名,包含了两个int值的无名称数组
int * pt;
pt = (int [2]){10, 20}; //包含两个int值的数组赋值给pt指针

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值