c 语言 一维数组指针,C 语言初级入门(7)--一维数组和指针

数组:

多个相同类型的变量被存储在一片连续的存储单元中;

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;

}

}

}

}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值