0. 数组的两种表现形式
一种是常见的a[10]; //初学者常用
另一种是用指针表示的数组. //实际工程使用.常用于参数传递
因为数组也是指针啊.
1. 一维数组的定义
数组是一批相同数据的集合 .
如果说 int a; 是在内存中开辟了一个int大小的空间,
那么 int a[10] 就是表示在内存中开辟了10个 连续的 int大小的空间,总大小为 10 * sizeof(int).
注意,数组开辟的空间是连续的 .
2. 数组的组成 .地址 大小 和 空间
就如同普通变量 int a = 10; 一样,数组也有 3要素组成.
auto int a[10];
在内存中开辟了一个超大的空间,这个空间有一个名字叫做 a,a即是名称,也是这段空间的地址 叫首地址.
这个超大空间分为10个小空间,每个小空间的大小是 int 大小.
这个也是默认放在栈空间auto.
3. 数组的初始化
数组的初始化有两种情况:
第一次初始化专用
非第一次初始化
第一次初始化: int a[3] = {2,3,4}; //这种大括号的初始化方式只能用于第一次初始化的情况下,往后赋值或者取值,只能用循环的方式来实现.
非第一次:
int i; for(i= 0; i<3;i++){ a[i] = i; }
注意:数组的下标是从0开始的 .
3. 一维数组和指针.!!!!!
定义一个指针,指向 int a[10] 的首地址
int *p = a;
或者
int *p;
p = a; //注意这里不是&a,因为a作为数组名, 本身就是地址 .
在数组中,
a[0] = 10; //数组版 *p = 10; //指针版 a[2] = 20; //数组
*(p+2) = 20; //指针版
首先,p = a,代表着首地址 ,比如是0xA0
那么 p+1 是什么意义? p+1 表示,在首地址的基础上,往下偏移1个空间量 那p+1=0XA1吗?? 不是的,因为这个数组的一个空间量是int大小 ,所以它的地址 应该是 0XA0+(sizeof(int) * 偏移量) //0XA4
然后再进行*运算代表取值.
数组指针操作的基本思想就是,在首地址的基础上,进行指针偏移,然后进行取值和赋值操作
//例子,数组指针的实际用途
//对数组 int a[10]进行排序
//思路: 写一个排序函数,然后把数组的指针作为参数传递进去
// 2. 首先,我们传进来的是一个数组指针,那么,数组a的指针怎么写呢// 数组a[10] 的指针是 int *p = a;
//所以设计函数的时候,形参部分就可以写,int *p, 即数组的形参. int sort(int *p){ //形参 //...具体功能 } int main(){
int a[10] = {1,3,2,5,6,4,9,7,8,0}; //定义一个数组 // 1. 我们的思想就是把这个数组的地址传递过去就可以了,那么实现这个功能,要怎么设计sort函数呢? sort(a); //实参 }
这里先介绍一下4个函数:
strcpy(s1,s2); //将s2复制给s1,一旦在s2中遇到' ', 就停止函数.
strcat(s1,s2); //将s2接在s1末尾.
strlen(s1); //返回s1的长度
strcmp(s1, s2); //比较两个字符串,如果s1 == s2 ,则返回0, s1< s2 返回值小于0, s1>s2 返回值>0 .