欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-02 11:52:42
...
/*
第九章   数组

  数组:多个相同类型的变量被存储在一片连续的存储单元中;
  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<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");
	}
}