一 指针
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的指针