C语言第五天

欢迎使用C语言

C数组

C语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。
数组的声明并不是声明一个个单独的变量,比如num0、num1、…num99,而是声明一个数组变量,比如nums,然后使用nums[0]、nums[1]、…nums[99]来带代表一个个单独的变量。数组中的特定元素可以通过索引访问
所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素最高的地址对应最后一个元素

声明数组

在C中要声明一个数组,需要制定元素的类型和元素的数量,如图:
类型 数组名字[数组尺寸];
这叫一维数组。数组的尺寸必须是一个大于零的整数常量类型可以使是任意有效的C数据类型。

初始化数组

在C中,可以逐个初始化数组,也可以使用一个初始化语句。
大括号{}之间的值的数目不能大于在数组声明时在方括号[]中指定的元素数目。
如果省略了数组的大小,数组的大小则为初始化时元素的个数。
所有的数组都是以0作为它们第一个元素的索引,也被称为基索引,数组的最后一个索引是数组的总大小减去1。

访问数组元素

数组元素可以通过数组名称加索引进行访问。元素的索引是放在方括号内,跟在数组名称的后边。

C中数组详解

多维数组

C支持多维数组。多维数组最简答的形式是二维数组。多维数组声明的一般形式:
类型 名字[行数][列数]…[sizeN]

二维数组

多维数组最简单的形式是二维数组。一个二维数组,在本质上,是一个一维数组的列表。type可以是任意有效的C数据类型,数组名是一个有效的C标识符。
数组中的每个元素是使用形式a[i,j]的元素名称来标识的,其中a是数组名称,i和j是唯一标识a中每个元素的下标。

初始化二维数组

多维数组可以通过在括号内为每行指定值来进行初始化。内部嵌套的括号时可选的。二维数组中的元素是通过使用下标(即数组的行索引和列索引)来访问。
二维数组在逻辑上是方阵,由行和列组成。
但是二维数组在物理上是线性的,按行来依次进行存放,内存是连续的。
二维数组名的步长是一行的长度。具体到每一个元素加1的时,地址增加的是一个元素所占字节的大小,因此元素的步长即为元素本身的大小。
将二维数组当做参数时,必须指明所有维数大小或者第一维的,但是不能省略第二维或者更高维的大小,这是由编译器原理限制的。
在定义二维数组时对其进行初始化,也可以省略第一维,编译器会根据设立的初始化语句自动决定第一维度。

C传递数组给函数

可以通过制定不带索引的数组名称来给函数传递一个指向数组的指针。
如果想要在函数中传递一个一维数组作为参数,必须以下面三种方式来声明函数形式参数,这三种声明方式的结果是一样的,因为每种方式都会告诉编译器将要接收一个整型指针。同样地,可以传递一个多维数组作为形式参数。

方式1

void a(int *b){}
形式参数是一个指针

方式2

形式参数是一个已定义大小的数组:
void a(int b[100]){}

方式3

形式参数是一个未定义大小的数组
void a(int b[]){}

Demo:

#include<stdio.h>
//第一维的长度可以不指定,但必须制定第二位的长度
void print_a(int a[][5],int n,int m){
    
    
int i,j;
for(i=0;i<n;i++){
    
    
for(j=0;j<m;j++)
printf("%d",a[i][j]);
printf("\n");
}
}
void print_b(int (*a)[5],int n,int m){
    
    
int i,j;
for(i=0;i<n;i++){
    
    
for(j=0;j<m;j++)
printf("%d",a[i][j]);
printf("\n");
}
}
//利用数组是顺序存储的特性,通过降维来访问原数组!
void print_c(int *a, int n, int m) {
    
     
    int i, j; 
    for(i = 0; i < n; i++) {
    
     
        for(j = 0; j < m; j++) 
            printf("%d ", *(a + i*m + j));
        printf("\n"); 
    } 
}
void main(){
    
    
int a[5][5]={
    
    {
    
    1,2},{
    
    3,4,5},{
    
    6},{
    
    7},{
    
    0,8}};
printf("\n方法1:\n");
print_a(a,5,5);
printf("\n方法2:\n");
print_b(a,5,5);
printf("\n方法3:\n");
print_c(&a[0][0],5,5);

}

从函数返回数组

C允许从函数返回数组。
C语言不允许返回一个完整的数组作为函数的参数。可以通过指定不带索引的数组名来返回一个指向数组的指针。
如果想要从函数返回一个一维数组,必须声明一个返回指针的函数,如:
int *fun(){}
C不支持在函数外返回局部变量的地址,除非定义局部变量为static变量。

小结

srand((unsigned)time(NULL))是初始化随机函数种子:
1.是拿当前系统时间作为种子,由于时间是变化,种子变化,可以产生不相同的随机数。计算机中的随机数实际上都不是真正的随机数,如果两次给的种子一样,是会生成同样的随机序列。所以,一般都会议以前的时间作为种子来生成随机数,这样更加的随机。
2.使用时,参数可以是unsigned型的任意数据,比如srand(10);
3.如果不使用srand,用rand()产生的随机数,在多次运行,结果是一样。

C指向数组的指针

数组名是一个指向数组中第一个元素的常量指针。
指针与数组的区别
char *str=“Hello”;
char arrgs[]=“Hello”;
字符数组:
char p=(char)&arrgs== char *p=arrgs;
cahr p=(char)(&(arrgs[0]))== &arrgs==arrgs;
字符串指针:
char p=(char)&str!=str;str == str[0] ==‘H’
得出结论字符数组的首地址可以用arrgs,&arrgs,来表示并且它们相等,
但是指针&str和str是不同的,当遇到字符串指针时要注意处理方式。

节点

数组是一种一次申请多个变量的方法,数组的使用可以在程序中保留多个变量的值,进行处理。
在没有明确数组的元素个数时,在程序中想知道数据单元个数可以使用sizeof(a)/szieof(a[0])。其中sizeof(a)是得到数组a的大小,sizeof(a[0])是得到数组a中单个元素的大小(因此可以不必要是a[0],a[i]都行)。
Demo

#include<stdio.h>
void main(){
    
    
	int a[]={
    
    1,2,3,4,5};
	int b;
	b=sizeof(a)/sizeof(a[0]);
	printf("数组元素个数:%d",b);
}

数组的初始化

对于数组的初始化需要注意以下几点:
(1)可以只给部分元素赋值,当{}中值的个数少于元素个数时,只给前面部分元素赋值。
当赋值的元素少于数组总体元素时,不同类型剩余的元素自动初始化值:
对于short、int、long,就是整数0;
对于char,就是字符’\0’;
对于float、double,就是小数0.0。
对于数组初始化,根据剩余的元素会自动初始化为0,只需给第0个元素赋值为0即可。
(2)只能给元素逐个赋值,不能给数组整体赋值。

指针与数组名的区别

指针:是一个变量,存储的数据是地址。
数组名:代表的是该数组最开始的一个元素的地址。

int a[10];
int *p;
p=&a[0]//可以写成p=a;

对数组元素a[i]的引用也可以写成*(a+i)这种形式。
赋值语句p=&a[0]也可以写成下列形式:p=a。
p是个指针,p[i]与*(p+i)是等价的。
区别:指针是一个变量,可以进行数值运算。数组名不是变量,不可以进行数值运算。

C enum(枚举)

枚举是C语言中的一种基本数据类型,它可以让数据更简洁,更易读。
枚举语法定义为:
enum 枚举名 {枚举元素1,枚举元素2,…}
注意:第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员加1。

enum season{
    
    spring,summer=3,autumn,winter};
//没有指定值的枚举元素,其值为前一元素加1

枚举变量的定义

可以通过以下三种方式来定义枚举变量
1.先定义枚举类型,再定义枚举变量

enum DAY
{
    
    
MON=1,TUE,WEDTHU,FRI,SAT,SUN
};
enum DAY day;

2.定义枚举类型的同时定义枚举变量

enum DAY
{
    
    
MON=1,TUE,WEDTHU,FRI,SAT,SUN
}day;

3.省略枚举名称,直接定义枚举变量

enum 
{
    
    
MON=1,TUE,WEDTHU,FRI,SAT,SUN
} day;

在C语言中,枚举类型是被当作int或者unsigned int类型来处理的,所以按照规范是没有办法遍历枚举类型的。
不过在一些特殊的情况下,枚举类型必须连续是可以实现有条件的遍历。
枚举类型不连续,枚举无法遍历。

猜你喜欢

转载自blog.csdn.net/qq_31932681/article/details/94920718