C语言-数组(1)

数组的概念

在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在C语言中,数组属于构造函数类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或构造类型。因为按数组元素的类型不同,数组又可以分为数值数组、字符数组、指针数组、结构体数组等各种类别。数组中的每一个数据称数组元素或下标变量。数组元素,由其所在位置序号(称数组元素的下标)来区分。用数组名与下标,可以用统一的方式来处理数组中的所有元素,从而方便的实现处理一批具有相同性质数据的问题。注:数据元素有序不是指元素的大小顺序。在C语言中使用数组必须先进行定义。

一维数组的定义方式:类型说明符   数组名 [常量表达式];

如:int a[10];

它定义了一个整型数组,数组名为a,此数组中有10个元素,10个元素都是整型变量。

注意事项:

1.类型说明符是任一种基本数据类型或构造数据类型。对于同一个数组,其所有元素的数据类型都是相同的。

2.数组名是用户定义的数组标识符。书写规则应符合标识符的书写规定。

3.方括号中的常量表达式表示数据元素个数,也称为数组的长度。

4.允许在同一个类型说明中,说明多个数组和变量,例:int a,b,c,d,k[20];

5.a[10],表示a数组有10个元素,注意下标是从0开始的,这10个元素是:a[0]、a[1]、a[2]、a[3]、a[4]、a[5]、a[6]、a[7]、a[8]、a[9]、。请特别注意,按上面的定义,不存在数组a[10]。

6.C语言不允许对数组的大小做动态定义,即数组的大小不依赖于程序执行过程中变量的值。下面这样定义是不可以的。

如:

int n;

scanf("%d",&n);

int a[n];

一些常见的错误:

1.float a[0];  //数组大小为0没有意义

2.int b(2)(3);  //不能使用圆括号

3.int k,a[k];     //不能用变量说明数组大小

以下是正确的演示:

1.int a[10];        //说明整型数组a,有10个元素

2.float b[10],c[20] ;    //说明实型数组b有10个元素,实型数组c有20个元素

3.char ch[20];         //说明字符数组ch,有20个元素

一维数组在内存中的存放

一维数组:int mark[100];

每个数据元素占用的字节数,就是其类型的字节数,一个元素占四个字节。

一维数组的引用

数组元素是组成数组的基本单元。数组元素也是一种变量,其标识方法是一维数组名后跟一个下标。下标表示了元素在数组中的位置。

数组元素的一般形式为:数组名[下标]

下标可以是整型常量或整型表达式。

如:

a[0]=a[5]+a[7]-a[2*3];

a[i+j];

a[i++]

都是合法的数组元素。

注意事项:数组元素通常也称为下标变量。必须先定义数组,才能使用下标变量。在C语言中只能逐个地使用下标变量,而不能一次引用整个数组。

例如:输出有十个元素的数组必须使用循环语句逐个输出各下标变量

for(i=0;i<10;i++)

{

printf("%d",a[i]);

}

而不能用一个语句输出整个数组。下面的写法是错误的:

printf("%d",a);

定义数组时用到的"数组名[常量表达式]"和引用数组元素时用到的“数组名[下标]”是有区别的。

如:

int a[10];         //定义数组长度;

t=a[6];             //引用a数组中序号为6的元素,此时6不代表数组长度。

例:

#include<stdio.h>

void main()

{

int i,a[10];

for(i=0;i<=9;i++)

{

    a[i]=i;

}

for(i=9;i>=0;i--)

{

printf("%d",a[i]);

}

}

一维数组的初始化

给数组赋值的方法除了用赋值语句对数组元素逐个赋值外,还可以采用初始化赋值和动态赋值的方法。数组初始化赋值是值在数组定义的时候给数组元素赋予初值。数组初始化是在编译阶段进行的,这样将减少运行时间,提高效率。需要注意的是,之前用赋值语句或输入语句也可以给数组元素指定初值,是在运行时完成的。

初始化赋值的一般形式为:类型说明符  数组名[常量表达式]={值,值,值,值,……};

注意事项:

1.在定义数组时对数组元素赋予初值

如: int a[10]={0,1,2,3,4,5,6,7,8,9};

将数组元素的初值依次放在一对花括号内,经过上面的定义和初始化之后a[0]=0、a[1]=1、

a[2]=2、a[3]=3、a[4]=4、a[5]=5、a[6]=6、a[7]=7、a[8]=8、a[9]=9。

2.可以只给一部分元素赋值

例:int a[10]={0,1,2,3,4};

定义a数组有十个元素,但是花括号内只提供了五个初值,这表示前面五个元素赋初值,后五个元素值为0。

3.如果想要一个数组中全部元素值为0,可以写成:

int a[10]={0,0,0,0,0,0,0,0,0,0};           或           int a[10]={0};

4.在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度。

如:int a[5]={1,2,3,4,5};    也可以写成:int a[ ]={1,2,3,4,5}; 

在第二种写法中,花括号有五个数,系统就会根据自动定义a数组的长度为5,但若数组长度与提供初值的个数不相同,则数组长度不能省略。例如:想定义数组长度为10,就不能省略数组长度的定义,而必须写成int a[10]={1,2,3,4,5};只初始化前五个元素,后五个元素为0。

例1:数组初始化与未初始化比较:

#include<stdio.h>

void main()

{

int i,a[5]={3,4,5},b[5];

printf("array a is :\n");

for(i=0;i<5;i++)

}

printf("%6d",a[i]);

}

printf("array b is :\n");

for(i=0;i<5;i++)

{

printf("%6d",b[i]);

}

例2:动态赋值的方法

#include<stdio.h>

void main()

{

int i,max,a[10];

printf ("input 10  numbers:\n");

for(i=0;i<10;i++)

{

scanf("%d",&a[i]);

}

max=a[0];

for(i=1;i<10;i++)

if(a[i]>max)

max=a[i];

printf("max num=%d\n",max);

}

冒泡法:将相邻两个数比较,将小的调在前头。如果有n个数,则要进行n-1趟比较,在第一趟比较中要进行n-1次两两比较,在第j趟比较中,要进行n-j次两两比较。

例:用冒泡法对10个数排序,从小到大。

过程提示:

1.先通过动态赋值的方法让用户输入十个待排序的数字,通过数组保存起来。

2.掌握两个循环,外层循环限制有多少趟比较,内层循环限制某趟比较要进行两两对比的次数。

3.如果a[i]>a[i+1],则将两数进行交换,因为要求从小到大排列。

4.把最终的结果输出到屏幕!

#include<stdio.h>

void main()

{

int a[10];

int i,j,t;

printf("input 10 numbers:\n");

for(i=0;i<10;i++)

{

scanf("%d",a[i])

}

printf("\n");

for(j=0;j<9;j++)

{

for(i=0;i<9-j;i++)

{

if(a[i]>a[i+1])

{

t=a[i];a[i]=a[i+1];a[i+1]=t;

}

}

printf("the sorted numbers:\n");

for(i=0;i<10;i++)

printf("%d",a[i]);

}

printf("\n");

}

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中,使用printf函数打印数组时,可以使用数组名作为参数。数组名表示整个数组的地址。例如,对于整型数组arr,可以使用以下代码打印数组的首元素地址和数组地址: ```c int arr\[5\] = { 0 }; printf("(数组名)首元素地址=%p\n", arr); // 数组名是数组首元素地址 printf("数组地址=%p\n", &arr); // 取出数组地址 ``` 输出结果可能如下所示: ``` (数组名)首元素地址=0x7ffeedd8a000 数组地址=0x7ffeedd8a000 ``` 需要注意的是,数组名表示整个数组的地址,而不是数组的值。如果想要打印数组的值,可以使用循环结构遍历数组的每个元素,并使用索引访问每个元素的值。 引用\[1\]来源:(2)&数组名-数组名表示整个数组-取出的是整个数组的地址。\[1\] #### 引用[.reference_title] - *1* [[C语言]数组的传递](https://blog.csdn.net/qq_43559301/article/details/129219719)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [C语言字符数组](https://blog.csdn.net/qq_40794602/article/details/104086123)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值