一组数组与字符数组

数组属于构造类型

数组的定义

通过一个符号访问多个元素

数组是指一组具有相同数据类型的数据的有序集合

int   a[10];

定义一个整型数组,数组名为a,它有10个元素。

声明数组时,要遵循以下规则:

1,数组名的命名规则和变量名相同,即遵循标识符号命名规则。

变量名命名规则:数字,字母,下划线,必须以字母下划线开头

2,在定义数组时,需要指定数组中的元素的个数,方括号中的常量表达式用来表示元素个数,即数组长度

3,常量表达式可以包含常量和符号常量,但不能包含变量,也就是说C语言不允许对数组的大小做动态定义,即数组大小不依赖于程序运行过程中变量的值。

int n=10;

int a[n]={0};C语言最新标准可以用变量进行定义数组,但是老版本不行,特别是考研是必须要用常量定义,不可以用变量,因为学校都是老版本

={0}作用是初始化,在十个元素里全放上零

数据声明的常见错误

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

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

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

最新的c标准支持,但是最好也不要那么写:

int n;

scanf("%d",&n)     在程序中临时输入数组的大小

int  a[n]; 

一组数组在内存中的存储

一维数组的初始化方法

数组都是从零开始的:

我们若是从一开始定义,那么a0对应的就是int1

(1)在定义数组时对数组元素赋初值

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

不能写成

int  a[10];a[10]={0,1,2,3,4,5,6,7,8,9}   会编译不通

靠后的称为高地址,靠前的称为低地址

(2)只给一部分元素赋值

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

定义a数组里面有10个元素,但是花括号内只提供五个初值,这表示只给前5个元素赋初值,后5个元素的值为零。

(3)如果要是一个数组中全部元素的值为0,那么可以写为

int a[10]={0};

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

int a[ ]={1,2,3,4,5};    考研初试不推荐此初始化方法

如果想知道一个数组的大小的时候,你可以点击运行框内的右边的加号,然后输入sizeof(数组名称)

数组的访问越界

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

int j=20;

int i=10;

a[5]=6;   //访问越界

a[6]=7;  //越界访问会造成数组异常

printf("i=%d\n",i);

输出结果,i=7 这是访问越界的危险之处

操作系统对内存中的每个位置也给予一个编号

当我们没有注意到数组的空间大小,访问越界时,就会改变其他变量的值,一改变其他变量的值,最终的运行结果就是不对的。

 常见的访问越界其实是你写了一个for循环,然后你再for循环里去访问到了数组的每一个元素,然后你那个for循环的边界没有控制好,然后就造成了访问越界

编译器不会检查程序对数组下标的引用是否在数组的合法范围内

数组的传递

例子:

int a[5]={1,2,3,4,5};  //定义数组时,数组的长度必须固定

print(a,5);   //不是printf,而是自己定义的一个函数

printf("a[4]=%d\n",a[4]);  通过自己定义的函数对数组进行输出

//main函数就是主函数,一个项目里只有一个main

int main(){

int a[5]={1,2,3,4,5};   不传递的例子

int i;

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

{

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

}

//把这串代码放到一个子函数里面去写

void就是空,什么也不用写,什么也不用返回,不需要return

void  print(int a[5])   i有,但是a没有,数组在传递时,是不需要写数字的。数组长度无法传递。

{

int i;

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

{

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

}

}

int main(){

int a[5]={1,2,3,4,5}

printf(a);    调用子函数print,就要把a传进去

print(a[5])这样是错误的,就访问越界了,访问到a5了。数组使从a0开始定义数据的

int main(){

int a[5]={1,2,3,4,5};   不传递的例子      这里中括号里的数可以改掉。,后面的代码可以无需变动

int i;

for(i=0;i<sizeof(a)/sizeof(int);i++)  sizeof(a)  //a的长度是数组整个的长度,他每个元素的长度是4个字节,这里是20个字节,20/4=5.

//所以这里的输出就非常灵活了

{

     printf("%d\n",a[i]);     这样是直接一行过去的

}

{

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

}

printf("\n)       这是每个数占一列

void  print(int a[ 这里别写!!!!],int length)    长度是无法传递的,所以a【】无论怎么改,都没有用

int length 就是我们在定义一个整型变量,把数组的长度传递过去

{

int i;

 for(i=0;   i<length【i<sizeof(a)/sizeof(int);i++)  sizeof(a)   这里的sizeof(a)为8,数组名无法传递到子函数,弱化为了指针(指针为8个字节)

//数组名传递到子函数后,子函数的形参接收到的是数组的起始地址,因此不能把数组的长度传递给子函数

所以需要重新额外定义一个变量

}

int main(){

int a[5]={1,2,3,4,5}

printf(a,length:5);

调试按钮

折弯 F8 步过 :当前函数一步步往下走

向下箭头 F7 到达某个函数,要进入自己的子函数

子函数:把某一个常用功能封装起来的作用

字符数组与scanf读取字符串

对字符数组进行额外的讲解,因为它较为特殊

(1)对每个字符单独赋值进行初始化

(2)对整个数组进行赋值

以上两种方法都较为麻烦

int main()

{

char c[5]={'a','b','c','d','f'}

return 0;

}

常用的字符初始化方式

int main()

{

char c[10]={"iamhappy"}

int main()

{

//char c[5]={"hello"};    这样子就不合适了,hello后面还有个\0,这样子写就访问越界了

char  c[6]={"hello"};    这样子就正确了

printf("%s\n",c);   字符串是可以一个整体输出的,不用一个一个输出。 %s用来输出一个字符串,直接把字符数组放到printf 这个位置

return 0;

}

int main()

{

char c[5]={'h','e','l','l','o'};   字符数组没有结束字符,循环无法结束,所以会输出乱码

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

return 0;

}

输出字符乱码时,要去查看字符数组中是否储存了结束符‘\0’

模拟printf("%s",c)操作,将其中的运行原理解释清楚,简单来说就是,模拟printf%s怎么输出字符串的

%s怎么样去输出,其实相当于一个循环,每一次去ASCII表中一个一个地输出

void print(char d[])

{

  int i=0;

  while(d[i])  //当走到结束符时,结束循环

{  

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

     i++;

}

    printf("\n")     //进行换行,让格式更加美观

    d[0]='H';  //可以改

int main( )

{

    char c[6]="hello";

    char d[5]="how";

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

    print(d);   //print,不是printf,用c来展示printf%s的输出

    return 0;

}

scanf读取字符串

scanf读取字符串操作

int main()

{

     char c[10];

     scanf("%s",c);    //scanf是必须要放一个地址的,但因为字符数组名c中已经存储了数组的起始地址,所以并不需要在取地址。

也不是说一定不可以取地址

    printf(“%s“,c”);

   return 0;

}

scanf会自动填入结束符

整型数和浮点数都是忽略空格的

scanf%s读取字符串时自动忽略空格和回车

输入数值后scanf将其读取

gets函数(读取)

scanf如何一次读一行字符串?scanf一次读一整行字符串的操作比较麻烦,一般不用scanf一次读一整行字符串,反而选用gets函数。

int  main()

{

       char c[20];

        gets(c);//gets中放入我们字符数组的数组名即可

        printf("%s\n",c) //也可写作puts(c)

        return 0;

}

我们填入的内容可以带空格,也可以带入其他字符,都不影响。

gets函数遇到换行符才不读

gets函数遇到\n后,不会存储\n,而是将其翻译为空字符\0

puts函数

等价于printf(“%s\n”),但只能输出字符串,但puts内放的参数是字符数组名

str系列字符串操作函数(初试没有那么重要,机试更为重要)

str系列字符串操作函数主要包括strlen,strcpy。strcmp,strcat等

strlen函数用于统计字符串长度,统计的是为人输入的字符串长度

strcmp函数用于比较两个字符串的大小

strcpy函数用于将某个字符串复制到字符数组中

strcat函数用于将两个字符串连接到一起

str系列字符串操作函数引用的头函数不是<stdio.h>,而是<string.h>

自己写一个mystrlen函数去看strlen是如何计算字符串长度的

本质就是用一个循环,不断循环,然后直到循环到\0就可以了

int  mystrlen(char c[])

{

      int i=0;

      while(c[i])    //找到结束符后,循环结束,从而得到字符串的长度

    {

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

          i++;

}

      return i;    //return的值会放到变量里面           c[5]结束符是\0,他就不会进入这个循环了,此时i的结束值刚好是5,字符串的长度也是5,因此可以写作return i。

有没有带空格是无所谓的

int main()

{

        int len; //用于存储字符串长度

        char c[20];

        char d[100]=“world”;

        gets(c);

        puts(c);

        len=strlen(c);

        printf("len=%d\n",len);

         len=mystrlen(c);

         printf("my len=%d\n",len);

         return 0;

}

strcat(c,d)把d中的字符串拼接到c中

strcpy(c,d)c中的字符串复制给d

printf("c?d%d\n",strcmp(c,e));c大于e,返回值为正数,c小于e,返回值为负

printf("c?d%d\n",strcmp(c,"how"));

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值