数据结构复习之C语言指针与结构体

数据结构指针复习:
#include <stdio.h>

void main()
{
    int a[5] = {8, 2, 3, 4, 5};
    
    // a[3] == *(3+a)

    printf("%d
", *(3+a)); // a[3] 4
    printf("*a其实就是a[0]: %d
", *a); // 8

    // 地址是连续的
    printf("%p
", a+1);
    printf("%p
", a+2);
    printf("%p
", a+3);
}

一维数组名是个指针常量,它存放的是一维数组第一个元素的地址,它的值不能被改变,
一维数组名指向的是数组的第一个元素的地址。(获取)修改一个数组,就是要把数组的第一个元素的地址和数组的长度传递进去就行了。

#include <stdio.h>

void Show_Array(int *p, int len)
{
    p[0] = -1;
    int i;
    
    for(i = 0; i < len; i++)
    {
        p[i] = p[i] + 1;
        printf("%d
", p[i]);
    }

}

int main(void)
{
    int a[5] = {1, 2, 3, 4, 5};

    Show_Array(a, 5); // a等价于&a[0], &a[0]本身就是int *类型

    return 0;
}
通过函数修改实参的值:
#include <stdio.h>

void f(int *p)
{
    *p = 99;
}

int main(void)
{
    int i = 10;
    
    f(&i);
    printf("%d
", i);
    
    return 0;
}


结构体使用概述:
结构体只有属性,没有方法。结构体是类的一个过渡。
为什么会出现结构体?
    为了表示一些复杂的数据,而普通的基本类型无法满足要求。
什么叫结构体?
    结构体是用户根据实际需要自己定义的复合数据类型。
#include <stdio.h>
#include <string.h>

struct Student    // 定义了一个新的数据类型
{
    int sid;
    char name[200];
    int sage;
    
}; // 分号不能省

int main(void)
{
    // 定义一个数据类型是struct Student的变量st
    struct Student st = {1000, "zhangsan", 20};
    printf("%d %s %d
", st.sid, st.name, st.sage);
    
    st.sid = 99;
    strcpy(st.name, "lisi");
    st.sage = 22;
    printf("%d %s %d
", st.sid, st.name, st.sage);
    
    return 0;
}


#include <stdio.h>

struct Student
{
    int sid;
    char sname[200];
    int sage;
};

int main(void)
{
    struct Student st = {1000, "zhangsan", 20};

    // st.sid

    // 定义一个指针变量
    struct Student *pst;
    pst = &st;
    pst->sid = 99; // 等价于(*pst).sid, st.sid

    return 0;
}

结构体的实现,两种方式:
struct Student st = {1000, "zhangsan", 20};
struct Student *pst = &st;
1. st.sid
2. pst->sid
pst所指向的结构体变量中的sid这个成员
pst是指向结构体变量的指针,*pst就是st

int *p;
p是指针变量,*p是普通变量。

注意:
结构体变量不能加减乘除,但可以相互赋值
普通结构体变量和结构体指针变量作为函数传参的问题

 
原文地址:https://www.cnblogs.com/lqcdsns/p/6569186.html