C 语言初级入门--一维数组和指针

/*[size=medium][color=olive]
第九章 数组

数组:多个相同类型的变量被存储在一片连续的存储单元中;
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、数组元素地址作为实参
因为是地址值,那么对应的形参也应是基类型的指针变量;

[/color][/size]
*/
#include<stdio.h>
#define M 100 //宏定义 一般定义大写常量
void arrout(int *,int); //定义函数逇说明部分
int arrin(int *);
#define NUM 8
void invert(int *,int);
void priout(int *,int);
main()
{
/*
int a[10];
int i,*p;
p=a; //表示指针向了a
for(i=0;i<10;i++)
{
//p++ 移动
scanf("%d\n",p++); //将获得的值放到地址里面,且指针指向了数组;
printf("a[%d]=%d\n",i,*p); //此时指针的位置没有发生变化 只保存了数组首位的值

}

int s[M] ,k;
k=arrin(s);
arrout(s,k);
*/
//一维数组应用 题目:将数组中的数按颠倒的顺序重新存放,
//操作的时候只能借助一个存储单元,不得另外开辟数组;
int a[NUM] = {10,21,31,40,50,60,70,80};
print("输出数组中的内容:");
priout(a,NUM); //3
invert(a,NUM); //4
printf("输出数组中调换后的内容:");
priout(a,NUM);
}
//3
void priout(int s[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%4d",s[i]);
printf("\n");
}
}

//4
void invert(int *a,int n)
{
int i,j,t;
i=0;
j=n-1;
while(i<j)
{
a[i]=a[j];
a[j] = t;
i++; t=a[i];

j--;
}
}
int arrin(int *a)
{
int i,x;
i=0;
scanf("%d",&x);
while(x>=0)
{
*(a+i)=x;
i++;
scanf("%d",&x);

}
return i;
}
void arrout(int *a,int n)
{
int i;
for(i=0;i<n;i++)
{
printf(((i+1)%5==0)?"%4d\n";"%4d",*(a+i));
printf("\n");
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值