关闭

学习笔记4-C语言数组和字符串

220人阅读 评论(0) 收藏 举报

数组的基本概念及分类

      数组:把具有相同类型的若干变量安装有序的形式组织起来。这些按序排列的同类型数据的集合称为数组。

       数组元素:构成数组的数据。每个数组元素有相同的名称,不同的下标。

       数组下标:是数组元素位置的一个索引。从0开始。

       维数:数组元素下标的个数。根据维数可以分为一维数组,二维数组,三维数组和多维数组。

       按存储内容分类:数组数组、字符数组、指针数组和结构数组。

 

一  一维数组

1 一维数组的定义

如果一个数组所有的元素都不是数组,这种数组称为一维数组。

数组的定义方式:

类型说明符  数组名[常量表达式];

 

类型说明符:基本数据类型或者构造数据类型。

数组名:用户定义的数组标识符。

方括号内:数组元素的个数。

 

注意

a 数组的长度可以是常量也可以是常量表达式还可以是宏。不可以是变量。

b 数组表示符遵守标识符命名规范。

c 数组名不能与其他变量名同名。

  2一维数组的初始化

给每个数组赋予初值。初始化是在编译阶段进行的。

 

a 定义的同时初始化

类型说明符 数组名[常量表达式]={值列表};

int arr[3]={1,2,3};

类型说明符 数组名[]={值列表};

int arr[]={1,2,3};

元素的个数决定了数组的长度。

 

b 定义的同时部分初始化

类型说明符 数组名[常量表达式]={部分值列表};

int arr[3]={1,2};


int arr[3]={[1]=12};

将下标为1的元素赋值为12

 

c 先定义数组后初始化

定义数组: int arr[3];

初始化:a[0]=1;

                  a[2]=2;

注意

数组未初始化的初值为随机值。

数值型数组部分初始化的数组其他元素初值为0.

字符型数组部分初始化的数组其他元素初值为ascii码的0.

3一维数组的引用

数组名[下标];  下标从0开始。

4一维数组的存储方式。

a 计算机会给数组分配一段连续的内存空间。

b 数组名代表数组的首地址,从首地址位置依次存入数组的第一个,第二个…第n个元素。数组收地址==数组第一 个元素的首地址==数组名

c每个元素占用空间的大小取决于数组类型。

d元素地址是连续的。

5一维数组长度计算方法

 

计算数组总长度(字节):sizeof(数组名)数据类型长度:sizeof(数据类型)

数组长度=数组总长度/数组类型;

注意 数组越界问题。

6数组元素作为函数参数

a 每个元素作为函数实参。

b 数组名作为函数的形参和实参。

函数调用时,实参和形参之间是地址传递,将实参数组的首地址传给形参数组。

              

函数定义

              返回值类型  函数名(数组类型参数名称[]){

                     函数体;

}

函数调用

函数名(数组名);

 注意

形参数组和实参数组的数据类型必须一致。

形参数组的长度可以不写。

函数体内无法计算形参数组的长度。

7 排序

1)冒泡排序

思想:重复访问排序的数列,一次比较相邻的两个元素,如果顺序错误就将两个值进行交换。知道没有需要交换为止。

小数上浮,大数下沉。

 

冒泡排序算法实现

 

<span style="font-size:14px;">//
//  main.c
//  冒泡排序
//
//  Created by ywxkdz on 15/11/14.
//  Copyright (c) 2015年itcast. All rights reserved.
//
 
#include<stdio.h>
 
voidMaoPaoSort(int a[],int len);
 
intmain(int argc, const char * argv[]) {
   
   
    int a[]={38,55,67,88,33,82,89};
    int len=sizeof(a)/sizeof(int);
    MaoPaoSort(a, len);
    for (int i; i<len; i++) {
        printf("%d \t",a[i]);
    }
 
}
 
voidMaoPaoSort(int a[],int len){
   
    int temp=0;
    //双重循环
    for(int i=0;i<len-1;i++)
    { for (int j=0;j<len-i-1;j++)
        if (a[j]>a[j+1])
        {
            temp=a[j];
            a[j]=a[j+1];
            a[j+1]=temp;     //如果前一个数大于后一个数,大数下沉,将两个数进行交换。
        }
    }
   
   
}
 </span>


 

 

2)选择排序

遍历数组,现在数组中的最小值放到数组的第一个位置,将剩余的数组重复查找最小值放到第二个位置…将所有的元素查找完为止。

 

              选择排序算法实现

<span style="font-size:14px;">//
// main.c
//  选择排序
//
// Created by ywxkdz on 15/11/17.
// Copyright (c) 2015年 itcast. All rights reserved.
//
 
#include <stdio.h>
 
void selectSort(int a[],int len);
 
int main(int argc, const char * argv[]) {
   
   
   int a[]={38,55,67,88,33,82,89};
   int len=sizeof(a)/sizeof(int);
   selectSort(a, len);
   for (int i; i<len; i++) {
       printf("%d \t",a[i]);
    }
   
}
 
void selectSort(int a[],int len){
   
   int temp=0;
   //双重循环
   for(int i=0;i<len-1;i++)
    {
           int k=i;       //首先将第i个值当作最小值,用k记录最小值的下标
           for (int j=i+1;j<len;j++){
       
                if(a[k] > a[j]){
           
                    k = j; //如果发现比当前最小值还小的值,将其下标重新赋值给k
                }
       
            }
       
       /*
        内层循环结束后 k 记录的是数组第i个元素后的最小值,
        第i个元素与该最小值进行交换
        */
       temp=a[i];
       a[i]=a[k];
       a[k]=temp;
   
    }
   
}
 </span>


 

二 二维数组

特殊的一维数组,一维数组的每个元素又是一个一维数组。

1 二维数组的定义

 

类型说明符 数组名[行数][列数]

 

2 二维数组初始化

1) 完全初始化

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

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

         2)可以省略第一维长度,跟一维数组省略长度类似

         3)部分初始化

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

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

           4)先定义后初始化

               int a[2][3];

                    a[0][0]=1;

                     ……

       3  二维数组的遍历

              双下标形式

              数组名[行下表][列下标];

              双循环遍历,外层循环遍历行,内循环遍历列

       4  二维数组的存储

              a计算机分配连续的内存空间

              b数组名代表数组首地址。

              c每一行存储方式,从行首地址开始,依次存储第一个,第二个…

              d每个元素的占用字节数相同,取决于数组类型

              e 数组元素之间地址连续。

       5 二位数组做参数

              类似一维数组。

三 字符串

字符串是位于双引号中的字符序列。

在内存中以”\0”结束,所占字节比实际字节多一个。作为字符串的结束符。

C语言中没有字符串变量。可以用字符数组存放字符串。

1 字符数组的定义

        char数组名[数组长度];

       char  ch[10]=”ABCDEF”;

2 字符数组的初始化

       参考数值数组的初始化。

       char  str[4]={“sdaddsa”};

char str[]=“dadada”;


注意

数组长度>实际长度+1

可以在定义数组并赋值的时候不添加数组长度

char str[]=“dadada”;

3 字符数组的引用

       1)类似数值数组用%c打印

        2)以%s打印整个字符串数组。输出一条字符串。遇到”\0”结束。必须在初始化的时候保证末尾有“\0“

3)以%s接收键盘输入的字符串,遇到字符串空格结束。并且输入的长度小于字符数组的长度。

4 字符数组的长度

       sizeof(数组名)

5 字符数组和普通数组的区别

1) scanf和printf时候都 可以用%s进行字符串的输入输出。

2) 字符串数组初始化的时候可以去掉大括号。

char str[10]=”sdadas”;

6 字符串处理函数

       使用函数的时候需要包含string.h的头文件

1) 字符串输出函数puts

puts(地址);打印该地址之后的字符串遇到“\0”为止

可以自动换行

2) 字符串输入函数gets

gets(地址);

会有警告,输入长度可能会大于数组长度。

3) 连接字符串strcat

strcat(str1,str2);将字符串str2连接到str1之后。赋值给str1.

4) 字符串拷贝函数strcpy

strcpy(str1,str2);将str2copy到str1中。会覆盖str1之前的值。

5) 字符串比较函数strcmp

strcmp(str1,str2); 比较两个字符串的大小,比较方法是从第一个字符开始逐个比较字符的ascii值。知道遇到不同的为止。ascii值大的字符串大。

  返回值 >0 str1>str2

返回值<0   str1<str2

返回值=0   str1==str2

6) 字符串长度计算strlen

计算字符串的长度 不计算“\0“

strlen(str);

 

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:3784次
    • 积分:194
    • 等级:
    • 排名:千里之外
    • 原创:16篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    文章存档