C语言 day9

2022-06-08  本文已影响0人  y_7539

指针类型的意义

1.指针类型决定了:指针解引用的权限有多大
2.指针类型决定了:指针走一步,能走多远(步长)

int main()
{
    int arr[10] = { 0 };
    int* p = arr;
    char* pa = arr;
    printf("%p\n", p);
    printf("%p\n", p+1);
    printf("%p\n", pa);
    printf("%p\n", pa+1);
    /*0093FE44
    0093FE48
    0093FE44
    0093FE45*/
}
int main()
{
    int arr[10] = { 0 };
    int* p = arr;
    int i = 0;
    for (i = 0;i < 10;i++)
    {
        *(p + i) = 1;
    }
}

避免野指针

1.指针初始化
2.指针指向空间被释放掉后置空
3.小心指针越界
4.指针使用之前检查有效性

指针-指针得到的是两个指针之间的元素个数(前提是两个指针指向同一空间)

int main()
{
    int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    int* p = arr;
    printf("%d\n", arr[2]);
    printf("%d\n", p[2]); //p[2]->*(p+2)

    //2和arr是操作数  
    printf("%d\n", 2[arr]);


}
int main()
{
    int a = 10;
    //一级指针
    int* pa = &a;
    //ppa是二级指针,pa是一个变量。&pa取出pa在内存中的地址  
    int** ppa = &pa;
    //*ppa => pa      *pa => a 
}

指针数组

整形指针数组 int * pr[5]

结构体

也是一些值的集合,但是值的类型可以不同

struct Student
{
    struct S s;
    char name[20];
    int age;
    char id[10];
};

void print1(struct Student st) {
    printf("%c %lf %s %d %s \n", st.s.c, st.s.d, st.name, st.age, st.id);
}

void print2(struct Student *stud) {
    printf("%c %lf %s %d %s\n", stud->s.c, stud->s.d, stud->name, stud->age, stud->id);
}
int main()
{
    struct Student stu = {{'1', 1.11}, "张三", 17, "20202212"};
    printf("%c %lf %s %d %s\n", stu.s.c, stu.s.d, stu.name, stu.age, stu.id);
    print1(stu);  //传值调用
    print2(&stu);  //传址调用
}

函数调用的参数压栈
函数调用会在内存的栈区开辟一块空间

上一篇下一篇

猜你喜欢

热点阅读