C语言基础二_数组

本文介绍了C语言中数组的基本概念,包括定义方式、数组地址、一维数组的初始化及越界问题、数组作为函数参数的传递、二维数组的使用、字符串的表示和处理函数。强调了数组地址的概念,数组在函数调用中的行为,以及字符串的结束标志''的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组:

1.定义方式:int a[5];       //在64bit环境下占用4*5=20个字节

不可以是  int[5] a; 

int[] a;

int a[];

int b=5;  int a[b;]

2.数组的地址和变量的地址一样,都是第一个元素的地址

查看数组的地址方式:

int ages[5];

printf("%d\n",&ages[0]);

printf("%d",ages);//数组名代表数组的地址,也就是第一个元素的地址,ages是一个常量。

3.一维数组的初始化

注意:C语言编译器不会对数组下标越界进行检查的

int a[]={8,10};//可以省略a[2]

错误的做法举例:

int a[3];

a[3]={1,2,3};//下标越界了

a={1,2,3};//a是一个常量

4.一位数组和函数参数

一维数组的元素作为函数实参,与同类型的简单变量作为实参一样,是单向的值传递,即数组元素的值传给形参,形参的改变不影响实参

// b是test函数的形参(形式参数)

void test(int b) {
    b = 9;
}
int main()
{
int a[3];
a[0] = 10;
    printf("函数调用前的a[0]:%d\n", a[0]);
     test(a[0]);// a[0]是test函数的实参(实际参数)
printf("函数调用后的a[0]:%d", a[0]);
    return 0;
}//结果是:函数调用前后a[10]都是10


若把a[]数组传去当形参,由于传的是a的地址,所以test函数会改变a数组中的值。

5.二维数组

数组a[2][3]中a[0],a[1]也是数组名,不用加& ,就已经代表了各自数组的地址

若a[0]的地址为0001,在16位环境下,每个元素4个字节

则:&a[0][0]的地址也是1230

      a[1]的地址是3*4+1230=1242  等价:&a[1][0]的地址

6.二维数组的初始化

int a[2][3]={{2,3,4},{5,6,7}};

int b[2][3]={1,2,3,4};//顺序存,所以b[1][0]=4,b[1][1]=b[1][2]=0;

绝对不以省略列数,可以省略行数:b[2][]就是错的,但b[][3]就是对的。

7.字符串

一种方式是C语言通过字符数组声明字符串,与普通字符数组的区别在于,在字符数组的尾部加一个结束标志'\0'

所以字符串的长度是数组的长度+1

char s[]={'m','j','\0'}//这就代表一个字符串。

char s1[]="mj";//长度为3

输出方式:

printf("%s\n",s1);

puts(s);puts("mj");

方法区别:puts一次只能输出一个,printf可以输出多个

puts会自动换行

\0的作用:

char s1[]={'l','m','j','\0'};

char s2[]={'m','j'};

printf("%s",s2);//由于输出s,所以需要找到\0,打印出来mjlmj

puts(s2);//若以变量方式,由于puts是从s2开始打印,直到找到\0才停止,所以打印的结果是:mjlmj。

字符串输入:

char s2[]="mj";

char s1[2];

scanf("%s",s1);//s就是字符串的地址

gets(s1);

注:此函数不安全,会更改别的内存。

当输入itcast, 当printf("s1=%s , s2=%s",s1,s2);打印出:s1=itcast  s2=cast

原因在于,打印的是s1s2内存中的内容,s1s2在内存中是从上到下存储的。输入s1:itcast时,s1在内存中的两个字节数据为it,输出s1需要找到\0,所以会 打印出itcast

输出s2时,s2的mj\0被cast\0所占,所以会打印s2内存开始的cast。如图

scanf输入时不接受空格,tab来分隔输入。

gets可以读入包含空格,tab的字符串,知道遇到回车为止

8.字符和字符串处理函数

<stdio.h>
int a=65
putchar(a);//A
putchar(65);//A
putchar('A');//A
char c;
c=getchar();
int len=strlen("lmj");//len=3,字符长度

char s[]="lmj";
char s1[]={'m','j'};
printf("%d\n",strlen(s1));//5    从s1地址开始直到遇到\0
--------------------
<string.h>
char a[10];
strcpy(a,"lmj");//a=lmj

 char left[10]={'m','j','\0'};//left必须先声明长度,不然长度不够会内存溢出
strcat(left,"ios");//left="mjios"

int delta=strcmp("aBc","abc");
printf("%d",delta);//-32



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值