C语言数组知识点梳理

一、知识点梳理

1.零碎知识点整理

  1. 输出地址用%p或%#x。
  2. 数组声明之后变为常量,不能放在等号左边;初值表{…}只能用于初始化。
  3. 数组元素只能逐个进行引用,不能一次性引用。
  4. 数组越界的危害:
    (1)会覆盖其他变量的值(越界短时)
    (2)会出现段错误(越界过长)
  5. a+i==&a[i]
    *(a+n)=a[n]
  6. 对于一维数组 eg:int a[5]
    a ——————表示一级地址,列指针
    &a——————表示二级地址,行指针
    &a+1—————当于偏移20(4*5)个字节
  7. 对于二维数组 eg:a[2][3]
    a ——————组起始地址,为二级地址,行指针
    a[0] —————表示a[0][0]的地址,为一级地址,列指针
    a[0]+1————表示a[0][1]的地址
    a+1—————表示下一行的地址
  8. 二维数组地址的表示方式 eg:a[2][1]
    (1)&a[2][1]
    (2)a[2]+1
    (3)*(a+2)+1
  9. 二维数组行可以缺省,但列不行,eg : int a[][5]
  10. 用字符串常量对字符数组初始化注意字符串末尾包含’\0’ eg: char ch[4]=“boy”
  11. 字符串的输入/输出
    (1)逐个进行 %c
    (2)整个进行 %s
    (3)%s 输出遇到 ‘\0’ 终止
    (4)scanf 中 %s 输入遇到 " " 或者 “\n” 终止
  12. eg:
#include<stdio.h>

int main(void)
{
    char buf[]="Hello world!";
    char ch[]={'a','b','c','d'};
    printf("%s\n",ch);
    return 0;
 }
 
 输出为:
 abcdHello world!

#include<stdio.h>

int main(void)
{
    char buf[]="Hello world!";
    char ch[]={'a','b','c','d','\0'};
    printf("%s\n",ch);
    return 0;
 }
 
输出为:
abcd

两个例子说明了printf用%s进行输出遇到'\0'才停止
  1. eg:
char buf[10]="123456789";
printf("%.3f",buf1+3);

输出结果为:
456
  1. /ddd 为8进制数 d不能大于7
  2. 字符串声明时,若不赋值,则先清零
  3. 注意数组值进行交换时循环变量的控制,否则容易造成交换的值再被换回去。

2.学习的新函数

1.字符串处理函数

(1)字符串输入函数gets
格式:gets(字符数组)—建议用fgets( )
功能:从键盘输入一以回车结束的字符串放入字符数组中,并自动加’\0’
说明:输入串长度应小于字符数组维数
(2)字符串输出函数puts
格式:puts(字符数组)
功能:向显示器输出字符串
(输出完字符串后,再输出一个换行符)
说明:字符数组必须以‘\0’结束
ps:int n=100; char s[n];
gets(s);可以改成fgets(s, n, stdin);
gets很fgets区别:
gets总能获得一行,并放到s指向的内存里;
fgets仅获得一行的前n-1个字符。
gets会把一行结尾的’\n’字符换成’\0’
fgets保持一行字符的原样,在结尾添加一个’\0’
(3)字符串连接函数strcat
格式:strcat(字符数组1,字符数组2)
功能:把字符数组2连到字符数组1后面
返值:返回字符数组1的首地址
说明:字符数组1必须足够大 , 连接前,两串均以‘\0’结束;连接后,串1的‘\0’取消, 新串最后加‘\0’
(4)字符串拷贝函数strcpy
格式:strcpy(字符数组1,字符串2)
功能:将字符串2,拷贝到字符数组1中去
返值:返回字符数组1的首地址
说明:字符数组1必须足够大 , 拷贝时‘\0’一同拷贝 ,不能使用赋值语句为一个字符数组赋值
(5)字符串比较函数strcmp
格式:strcmp(字符串1,字符串2)
功能:比较两个字符串
比较规则:对两串从左向右逐个字符比较(ASCII码),
直到遇到不同字符或‘\0’为止
返值:返回int型整数,a. 若字符串1< 字符串2, 返回负整数
b. 若字符串1> 字符串2, 返回正整数
c. 若字符串1== 字符串2, 返回零
说明:字符串比较不能用“==”,必须用strcmp/.
(6)字符串长度函数strlen
格式:strlen(字符数组)
功能:计算字符串长度
返值:返回字符串实际长度,不包括‘\0’在内

2.内存处理函数

1. strncpy
格式:strncpy(数组1,数组2,n)
功能:把字符串2中的字符串复制到字符串1中,最多复制n个字符。当 src 的长度小于 n 时,dest 的剩余部分将用空字节填充。
2. strncmp
格式:strncmp(数组1,数组2,n)
功能:比较字符串str1和str2的前n个字符。
3. strncat
格式:strncat(dest,src,n);
功能:把src中的前n个字符添加到dest结尾处(覆盖原dest结尾处的’\0’),并添加新的’\0’。
说明:src和dest所指内存区域不可以重叠,并且dest必须有足够的空间来容纳src的前n个字符串,返回指向dest的指针。
4. strcasecmp
格式:strcasecmp(s1,s2)
功能:strcasecmp()用来比较参数s1 和s2 字符串,比较时会自动忽略大小写的差异。
5. strncasecmp
格式:strncasecmp(dest,src,n);
功能:比较两个字符串的前n个字符,忽略大小写。
6. memset
格式:memset(a,’/0’,sizeof(a));
功能:将数组a清零。
7. memcpy
格式:mencpy(dest,src,n);
功能:从src的开始位置拷贝n个字节的数据到dest。如果dest存在数据,将会被覆盖。
9. mencmp
格式:memcmp(dest,src,n);
功能:比较内存区域dest以及src的前n个字符

3.其他函数

1. sprintf
格式:sprintf(src,格式化字符串,argument1…)
功能:字符串合并
3. sscanf
格式:sscanf(src,格式化字符串,argument1…)
功能:字符串分割
ps:%[^=] 表示遇到等号停止

3.重要知识点

1. 冒泡排序
冒泡排序算法的运作如下:(从后往前)
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
在这里插入图片描述
eg:

# include <stdio.h>
int main(void)
{
    int a[] = {900, 2, 3, -58, 34, 76, 32, 43, 56, -70, 35, -234, 532, 543, 2500};
    int n;  //存放数组a中元素的个数
    int i;  //比较的轮数
    int j;  //每轮比较的次数
    int buf;  //交换数据时用于存放中间数据
    n = sizeof(a) / sizeof(a[0]);  /*a[0]是int型, 占4字节, 所以总的字节数除以4等于元素的个数*/
    for (i=0; i<n-1; ++i)  //比较n-1轮
    {
        for (j=0; j<n-1-i; ++j)  //每轮比较n-1-i次,
        {
            if (a[j] < a[j+1])
            {
                buf = a[j];
                a[j] = a[j+1];
                a[j+1] = buf;
            }
        }
    }
    for (i=0; i<n; ++i)
    {
        printf("%d\x20", a[i]);
    }
    printf("\n");
    return 0;
}

2. 选择排序
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完
第一趟排序,找出待数组中最小的一个元素和第一个元素进行交换
第二趟排序,找出待数组中最小的一个元素和第一个元素进行交换
在这里插入图片描述
eg:

void swap(int *a,int *b) //交换两个元素
{
    int temp = *a;
    *a = *b;
    *b = temp;
}
void selection_sort(int arr[], int len)
{
    int i,j;

        for (i = 0 ; i < len - 1 ; i++)
    {
                int min = i;
                for (j = i + 1; j < len; j++)    
                        if (arr[j] < arr[min])    
                                min = j;    //找到最小值
                swap(&arr[min], &arr[i]);    //做交換
        }
}

3. 插入排序
插入排序原理很简单,将一组数据分成两组,分别将其称为有序组与待插入组。每次从待插入组中取出一个元素,与有序组的元素进行比较,并找到合适的位置,将该元素插到有序组当中。就这样,每次插入一个元素,有序组增加,待插入组减少。直到待插入组元素个数为0。当然,插入过程中涉及到了元素的移动。
在这里插入图片描述

void InsertSort(int a[], int n)
{
    for(int i= 1; i<n; i++){
        if(a[i] < a[i-1]){//若第 i 个元素大于 i-1 元素则直接插入;反之,需要找到适当的插入位置后在插入。
            int j= i-1;
            int x = a[i];
            while(j>-1 && x < a[j]){  //采用顺序查找方式找到插入的位置,在查找的同时,将数组中的元素进行后移操作,给插入元素腾出空间
                a[j+1] = a[j];
                j--;
            }
            a[j+1] = x;      //插入到正确位置
        }
    }
}

4. 二分查找
适应情况:在一批有序数据中查找某数

基本思想:选定这批数中居中间位置的一个数与所查数比较,看是否为所找之数,若不是,利用数据的有序性,可以决定所找的数是在选定数之前还是在之后,从而很快可以将查找范围缩小一半。以同样的方法在选定的区域中进行查找,每次都会将查找范围缩小一半,从而较快地找到目的数。
eg:
在这里插入图片描述
在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
int bin_search(int arr[], int left, int right, int key)
{
    int mid = 0;
    while (left < right)
    {
        mid = (left + right) >> 1;
        //mid = (left + right)/2
        if (arr[mid]>key)
        {
            right = mid - 1;
        }
        else if (arr[mid] < key)
        {
            left = mid + 1;
        }
        else
            return mid;//若找到,返回下标
    }
    return -1;//未找到
}
int main()
{
    int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    int left = 0;
    int right = sizeof(arr) / sizeof(arr[0]) - 1;
    int ret = bin_search(arr, left, right, 5);//用ret接收函数的返回值
    printf("ret=%d\n", ret);
    system("pause");
    return 0;
}

二、学习心得

今天一天课上下来,能感觉到难度相比之前有提升,相信接下来只会越来越难。还有就是之前讲过的知识点现在使用有些还是不大能想起来。而且今天所讲的内容较之前专业课上学的有很大不同及提升,之前只是学了最基础的,只能算是对C语言有了解,今后不断学习不断将强才能逐渐掌握。

(注:今日起不再把所有知识点整理上来,只挑选之前未掌握的以及易错易混淆的部分。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值