数组和指针

一 指针

1.定义

    一个值为内存地址的变量(或数据对象)

2.查找地址符&

若AAA时变量名,则&AAA是变量存储的地址(通常为十六进制)

AAA=36

printf("%d,%p",AAA,%AAA);

输出为

36,3B67   (假设AAA的存储地址为3B67)

3.声明指针

int *pi1  //声明指向int类型变量的指针

float *pq2  //声明指向float类型变量的指针

char *pi  //声明指向char类型变量的指针

4.间接运算符*

用于将地址或者指针上的值付给另一个变量

AAA=22;

pi=&AAA;

BBB=*pi;

BBB的值最后为22

二 数组

1.定义

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

2.声明数组

int  AAA[x];  //int表示数组中元素的类型; AAA为数组名; x表示数组的大小,x必须为整数且大于0,x的值为数组中元素的数量

3.数组的初始化

和变量一样,数组在使用前要进行初始化(声明),初始化包括数组的类型,名称,大小,每一项的值(可有可无)

int days[5]={2,41,545,2,13}

则days[0],day[1]的值分别为2,41,days[2]以此类推

如果初始化时省略[]中的数字则数组会根据初始化时的项数来确定数组的大小;

如果初始化时数组的项数与数组的大小不同,则未初始化的项的值均为0;

sizeof(days)是整个数组的大小,sizeof(days[0])是一个元素的大小(单位是字节)

如何跳过某一项给后面的项赋值?

int days[6]={23,[2]=54,32}

则days[0],days[1]...day[5]的值分别为

23,0,54,32,0,0

4.给数组元素赋值

给数组元素赋值分为在初始化时赋值非初始化时赋值

注意仅有在初始化时赋值可以使用{}

5.多维数组

例如二维数组

float days[4][7];

float为数组days的类型;  days是数组名;  4说明有四个一级元素,7说明每个一级元素下有七个二级元素(一级元素实际上就是数组,这些数组的元素是二级元素)

三维数组及更高维数组一次类推...

多维数组的初始化

多维数组的初始化与非多维数组的方式相同,如

int days[3][4]={{3,4,1,43}{31,43,67,13}{90,0,42}}


三 数组和指针

如何编写处理数组的函数?

声明数组的形参

数组名实际上是该数组首元素的地址,因此调用数组需要通过指针来实现

函数声明和函数定义时有两种方式

int sum(int *a,int b)

int sum(int a[],int b)  

函数调用时仅能使用方式一

处理数组的函数的结构

方法一  数组表示法

int sum(int AAA[],int n)  //n作为元素的个数

{

int i;

int total=0;

for (i=0;i<n;i++)

total+=AAA[i];

return total;

}

方法二 指针表示法

int sum(int *start,int *end)

{

int total=0;

while (start<end)

total+=*start;

start++;    //指针指向下一个元素

return total;

}

具体解释可以看《C Primer Plus》(第6版 中文版)P254-256

const

const int a =0 表示锁定a的值

const int a[10]  表示锁定数组的值,若企图改变数组的值会报错

int * const a  指针a不能指向别处(但是可以修改地址上的值) 

const int * a  指针a上的值不能被更改

const int * a  的地址仅可以用于初始化指向const的指针或者为其赋值

指向多维数组的指针

int a[2][]

a等价于a[0]

a[0]等价于a[0][0]

**a等价于*a[0]等价于a[0][0]

&&a[0][0]等价于&a[0]等价于a

可以将*看作数组/地址降一级,将&看作将数组/地址升一级(0级为地址对应的值,1级为一阶数组,2级为二阶数组)

声明

int (* a)[2]  指针a指向一个内含两个int类型值的数组

int  *a[2]  数组a内的两个元素是指向int的指针


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值