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