三天速通C语言基础知识Day2——(考研数据结构)

指针

指针:通俗的讲,指针就是地址。然而,我们通常口头语所说的指针其实是指针变量,也就是保存指针的变量。

Tips: 

1、指针变量保存的是地址。在32位的系统中,指针变量大小是4字节,在64位系统中,指针变量大小是8字节。

2、指针变量区分类型的原因是,不同类型指针变量访问内存空间权限不同,整形指针可以访问4个字节,字符型指针可以访问1个字节。

eg:

 Tips: 

1、指针p记录了变量age的地址,指针q记录了变量eva的地址,可以说,指针p指向了age,指针q指向了eva。

2、指针就是地址,*好比钥匙,带着钥匙顺着地址就能打开变量的门,也就是可以查看变量值或者改变其值。上图代码中的*p就可以看作是变量age,*q就可以看作是变量eva。

注:打印p,输出的就是地址。

定义指针变量有两种方式,两种方式在执行逻辑上没有区别,但各有优缺点。

方式一:int* p;  // *在数据类型后面

方式二:int *p;  // *在变量名前面

空指针:若一个指针没有指向任何变量,或者说其没有保存任何变量的地址,我们就叫其空指针(NULL)。

int main({
    int* P-NULL;//定义整型指针p并初始化
    int age-24;//定义整型变量age并初始化
    p=&age;//为整型指针p赋值
    if(p!=NULL){//若指针p不为空,则打印其指向变量值
        printf("age=%d",*p);
    }
    return 0;
}

 malloc函数:动态分配指定大小的内存空间。(强制转换起始地址类型)malloc(分配内存空间大小);

free函数:释放动态分配的内存空间。  free(释放内存空间地址);

sizeof():用于计算括号内变量或数据类型所占字节数。

int main(){
    int a=0://静态分配内存,系统自动为变量a申请4个字节内存
    int *p=NULL;//定义整型指针p并初始化
    p=(int *)malloc(sizeof(int));//动态分配4个字节的内存
    *p-3;//为p指向的内存空间赋值
    printf("p指向地址存储数据为%d",*p);
    free(p);//释放指针p指向的内存空间
    p=(int *)malloc(sizeof(int)*10);//动态分配10个整型变量内存
    fee(p);//释放指针p指向的内存空间
    return 0;
}

Tips: 执行free(p);后,只是把指针p指向的内存空间释放了,而指针p并没有消失,只是此时指针p存储的地址没有意义了,但是指针p可以继续使用

 数组

数组:用来存储相同类型元素的集合。

数组的定义

方式一:静态定义数组

数据类型 数组名[元素个数];

方式二:动态定义数组

(指针类型)malloc(sizeof(数据类型)*元素个数);

Tips:
当知道数组元素个数时,采用静态定义数组;当不知道数组元素个数时,采用动态定义数组。数组元素的使用:数组名[元素下标]。

数组的初始化

 数组初始化是指在创建数组的同时给数组中的元素赋初始值。

int main(){
    int A[10];//直接定义整型数组A,不初始化
    char B[3]={A',B,C’;//定义字符型数组B,全部初始化
    int C[10]={0};//定义整型数组C,并全部初始化为0
    int D[10]={0,1,2};//定义整型数组D,部分初始化
    int E[]={0,1,2};//定义整型数组E,全部初始化
    return 0;
}

 变长数组

在C99标准前定义数组时,[]中必须是一个常量,不能使用变量。

在C99标准后定义数组时,[]允许使用变量了,但不允许初始化。

字符数组

字符数组不仅可以存储一个个的单个字符,还可以存储字符串。

int main(){
    char A[4]={'a',h',’u','i'};//定义字符型数组A并初始化
    char B[5]="ahui";//定义字符型数组B并初始化
    char C[5];//定义字符型数组C
    scanf("%s",C);//为数组C赋值字符串
    for(int i=0;i<4;i++){//打印数组A中的元素值
        print("%c",A[i]);
    }
    printf("%s",B);//打印数组B中的元素值
    printf("%s",C);//打印数组C中的元素值
    return O;
}

二维数组

int main(){
    int A[3][5];//定义3行5列二维数组A
    for(int i=0;i<3;i++){//初始化二维数组A
        for(int j=0;j<5;j++){
            scanf("%d",&A[i][j]);
        }
    }
    for(int i=0;i<3;i++){//遍历二维数组A
        for(int j0;j<5;j++){
            printf("%d ",A[i][j]);
        }
    }

    return O;
}

1、二维数组在内存中是连续存储的,但我们为了更直观的理解其存储逻辑,就把它画成3行5列的样子。

2、对于二维数组A[i][j],前面的i是行下标,后面的j是列下标。

     辅助记忆方法:线性代数中学过行列式,所以前面是行,后面是列。

结构体

结构体是一种自定义的数据类型,可以包含不同的数据成员。

 typedef的使用

 结构体的使用

typedef struct student{
    char name[20];//记录学生姓名
    int age;//记录学生年龄
    float weight;//记录学生体重
    int score;//记录学生分数
}stu,*stup;
int main {
    stu a;//定义结构体变量a
    stup b;//定义结构体指针b
    b=(stup)malloc(sizeof(stu));//创建结构体b
    scanf("%s",a.name);//为a中name成员赋值
    a.age=24;//为a中age成员赋值
    a.weight=75.5://为a中weight成员赋值
    a.score=150;//为a中score成员赋值
    printf("%s %d %f%d",a.name,a.age,a.weight,a.score);
    scanf"%s",b->name);//为b中name成员赋值
    b->age-25://为b中age成员赋值
    printf("%s的年龄为%d",b->name,b->age);r
    eturn 0;
}

Tips:结构体变量访问结构体内成员需要使用点(.)。

          结构体指针访问结构体内成员需要使用箭头(->)。

数据结构中的结构体实例 

 

加油加油!