数组:
多个相同类型的变量被存储在一片连续的存储单元中;
1、一维数组的定义和多维数组元素的引用: 定义:当数组中的每个元素只带有一个下标时,这样的数组为一维数组;
格式:类型名 数组名[整型常量表达式] ; int a[10]
说明:基本的语法同java
注:
在内存中给数组中每个成员开辟一个存储单元。总计大小:
10*4=40个字节。
a、当同时定义多个数组时彼此之间用逗号隔开:double w[22],v[4],u[6];
2、一维数组的引用: 格式:数组[下标表达式]
起点:0 上限:长度前一位;
b、在C语言中规定数组名是一个地址常量,它代表整个数组的首地址。
例如:int *p;int a[10]; p=a; 或者:p=a(p=&a[0])
3、一维数组的初始化:
int a[8]={1,2,3,4}; //保持类型是一致的
二:一维数组和数组元素的地址: 前言:定义的数组名可以认为是一个存放地址的指针变量,其中的地址值是 数组第一个元素的地址,也就是数组所占有一 串连续存储单元的起始地址。
重要的是:这个指针变量中的地址值不可改变,也就是说,不可以给数组重新赋值。因此,也可以认为数组名是一个地址 常量;
例如:int a[10],*p; p=a+4;====p=&a[4];
再如:for(k=0;k<10;k++){ p=a+k;}
在循环中没有改变数组名a中的内同,但是通过表达式,a+k
逐一给出了a数组中每个元素的地址,使p依次指向a数组中的每一个元素;
给数组中每一个元素赋值:
for(k=0;k<10;k++){
scanf("%d",a+k);
}
p=a 或 p=&a[0] 表达的意思是一样的,都是指针p指向了数组a的首位值 ;
p++:先向地址中赋值,然后指针移动;
总结:表示数组元素s[i]的表达式应当有:
s[i] *(s+i) *(p+i) *p[i]--这个前提,指针必须指向首地址;
当p=s+2 时,p=&a[2] *p[0]就是a[2]的值了;
5、函数之间对一维数组和数组元素的引用
a、数组元素作为实参
每个数组元素实际上代表内存中的一个存储单元。故和普通变量一样,对应的形参保持类型一致;
数组元素的值可以传送给该变量,在函数中只能对该变量进行操作,而不能直接饮用数组元素 ,更不能在函数中改变对应数组的值;
b、数组名作实参
数组名可以作为实参传送, 当时组名是一个地址值,因此对应的形参就是一个指针变量,此指针变量的基本类型必须和数组的类型一致;这样就可以通过指针变量来引用调用函数中对应的数组元素,从而达到对调用函数中对应的数组元素进行操作而改变其中的值;
当数组作为实参时,对应的形参除了是指针外,还可以用另外两种形式;
arrin(int a[]);
arrant(int a[M]);
c、数组元素地址作为实参
因为是地址值,那么对应的形参也应是基类型的指针变量;
以下代码来自郝斌的数据结构视频教程:
#include
#include
#include //包含 exit 函数
#define bool char
#define true 1
#define false 0
/*
vc6 对bool支持不好,所以才有上面的定义
*/
struct Arr
{
int * pBase;//存储的是数组的第一个元素地址
int len; //数组容纳最大元素个数
int cnt; //当前数组有效元素个数
};
void init_arr(struct Arr * pArr , int length );
bool append_arr(struct Arr * pArr , int val );//追加
bool insert_arr(struct Arr * pArr , int pos , int val);//插入 .pos从1开始
bool delete_arr(struct Arr * pArr , int pos , int * pVal);//返回被删除数的指针
bool is_empty(struct Arr * pArr);
bool is_full(struct Arr * pArr);
void sort_arr(struct Arr * pArr);
void show_arr(struct Arr * pArr);
void inversion_arr(struct Arr * pArr);
int main(int argc, char *argv[])
{
struct Arr arr;
int val;
init_arr( &arr, 6 );//发送地址,省内存
//show_arr( &arr );
append_arr(&arr,1);
append_arr(&arr,-2);
append_arr(&arr,3);
append_arr(&arr,-4);
append_arr(&arr,5);
//insert_arr(&arr , 6 , 99);// insert函数不完善 i
if( delete_arr(&arr , 2 , &val) )
{
printf("删除成功!\n");
printf("您删除的元素是:%d\n",val);
}
else
{
printf("删除失败!\n");
}
//倒置
inversion_arr(&arr);
show_arr( &arr );
//排序.冒泡
sort_arr(&arr);
show_arr( &arr );
//printf("%d\n",arr.len);
//printf("%d\n",strlen(arr));
printf("%d\n",arr.pBase[0]);
return 0;
}
void init_arr(struct Arr * pArr , int length)
{
pArr->pBase = (int *)malloc(sizeof(int) * length);
if(pArr->pBase == NULL)
{
printf("动态内存分配失败!\n");
exit(-1);
}
else
{
pArr->len = length;
pArr->cnt = 0;
}
}
bool is_empty(struct Arr * pArr)
{
if( pArr->cnt == 0)
return true;
else
return false;
}
void show_arr(struct Arr * pArr)
{
if( is_empty(pArr) )// pArr 本身已是存放 struct Arr 的地址了.顾不用再加取地址符号 &
{
printf("数组为空!\n");
}
else
{
int i;
for( i=0 ; i < pArr->cnt ; i++)
printf(" %d " , pArr->pBase[i] );
printf("\n");
}
}
bool is_full(struct Arr * pArr)
{
if(pArr->cnt == pArr->len)
return true;
else
return false;
}
bool append_arr(struct Arr * pArr , int val)
{
if( is_full(pArr) )
return false;
else
{
pArr->pBase[pArr->cnt] = val;
pArr->cnt++;
return true;
}
}
bool insert_arr(struct Arr * pArr , int pos , int val)
{
int i;
if (is_full(pArr))
return false;
if( pos<1 || pos>pArr->cnt+1 )
return false;
for( i=pArr->cnt-1; i>=pos-1; i-- )
pArr->pBase[i+1] = pArr->pBase[i];
pArr->pBase[pos-1] = val;
pArr->cnt++;
return true;
}
bool delete_arr(struct Arr * pArr , int pos , int * pVal)
{
int i;
if( is_empty(pArr) )
return false;
if(pos<1 || pos>pArr->cnt)
return false;
* pVal = pArr->pBase[pos-1];
for ( i=pos ; icnt ; i++)
pArr->pBase[i-1] = pArr->pBase[i];
pArr->cnt--;
return true;
}
void inversion_arr(struct Arr * pArr)
{
int i = 0;
int j = pArr->cnt-1;
int t;
while(i
{
t = pArr->pBase[i];
pArr->pBase[i] = pArr->pBase[j];
pArr->pBase[j] = t;
i++;
j--;
}
return;
}
void sort_arr(struct Arr * pArr)
{
int i=0, j=0, t;
for(i ; i < pArr->cnt; i++)
{
for(j=i+1; j < pArr->cnt; j++)
{
if(pArr->pBase[i] > pArr->pBase[j])
{
t = pArr->pBase[i];
pArr->pBase[i] = pArr->pBase[j];
pArr->pBase[j] = t;
}
}
}
}