程序设计和数据结构基础知识

1、内存分区


  1. 由程序员手动分配和释放;若程序员不释放,程序结束时由系统释放。
    分配:malloc(C语言),new(C++)
    释放:free(C语言),delete(C++)
    分配方式类似数据结构中的链表。


  2. 由编译器自动分配和释放。
    存放函数的参数值、局部变量的值等。
    操作方式类似数据结构中的栈。

  3. 全局存储区(静态存储区)
    存放全局变量和静态变量。
    包括DATA段(全局初始化区)和BSS段(全局未初始化区)。其中,在程序执行之前BSS段自动清0。

  4. 文字常量区

  5. 程序代码区

数组

1、数组定义中的类型
数组定义中类型不能是引用,即没有引用数组,这是因为引用是不能赋值的,而数组中的元素必须可以被赋值。

虽然没有引用数组,但数组可以有引用。

2、数组的初始化
函数体内定义的内置类型数组,元素无初始化(若只初始化部分元素,其后的元素此时也会被初始化为0);
不是内置类型的话,就调用默认构造函数。

3、C风格字符串和字符数组
字符串必须要有Null结束,’\0’。遇到’\0’后字符串终止,所以不要有多个’\0’。

4、二维数组
声明和初始化(包括在函数声明中)一个二维数组时,如果对二维数组的所有元素都赋值,则第一维(行数)可以省略。但第二维和更高维不能省略。

在C++中二维数组是按行优先存储的。因此在做矩阵运算的时候,采用行优先读取的算法比较快。

5、逗号运算符
表达式的值分别结算,但整个表达式的值是最后一个表达式的值。

指针

1、指针的运算

指针与整数的加减(包括自增自减)
指向另外一个指针。
float类型的指针加3,那么这个3会根据float类型的大小(此例中为4)进行调整(相乘),这样实际上加到指针上的整型值为12。

指针之间的比较
告诉你哪个指针指向数组中更前或更后的元素。

2、指针数组和数组指针

[]的优先级高于*

指针数组:
int *a[10];
数组里面装着指针,即指针数组是一个数组。

数组指针:
int (*p)[10];
还是一个指针,不过指向整个数组。

一维数组的数组名是一个指针,二维数组的数组名是一个数组指针。
但数组名是一个常量,不可以进行赋值操作,而数组指针可以。

3、字符串、数组、指针

指针指向字符串

char *p="hello"; //并不是把整个字符串装入指针变量,而是把存放该字符串的首地址装入指针变量。
p[0]='x'; //错误!!

指针指向数组

int ia[]={0,2,4,6,8};
int *ip=ia; //指针ip指向的是数组ia的首元素
ia[4]=9;  //将末尾元素8修改为9。还可以*(ia+4)=9; ip[4]=9; *(ip+4)=9;
ip=ip+1; //指向数组ia的第二个元素

4、sizeof(指针、数组名)
数组名作为函数形参时,可理解为一个指针,其内容也可以被修改。
其余时候,数组名是一个常量,不可以对数组名进行赋值操作。

char str[10];  //sizeof(str)==10
test(char str[10])
{
    //sizeof(str)==1
}

串的模式匹配算法

查找子字符串,然后返回第一次出现的位置

int Index(const char* str, const char* substr)
{
    int i=0;
    int j=0;
    while(i<strlen(str)&&j<strlen(substr))
    {
        if(str[i]==substr[j])
        {
            i++;
            j++;
        }
        else
        {
            i=i-j+2;//从下一个字符开始
            j=0;
        }
    }
    if(j<strlen(substr)) return -1;
    else retrun str+i-strlen(substr);
}
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页